Gruppierung von Suchergebnissen mithilfe von Gruppierungen
Paket org.apache.lucene.search.grouping Beschreibung
Dieses Modul kann die Suchergebnisse von Lucene gruppieren, und die angegebenen einzeln bewerteten Felder werden zusammen gesammelt. Beispielsweise werden die Gruppe nach dem Feld "Autor" mit demselben "Autor" -Feldwert in eine Gruppe unterteilt.
Bei der Gruppierung müssen Sie einige notwendige Informationen eingeben:
1. Groupfield: Gruppe nach diesem Gebiet. Wenn Sie beispielsweise das Feld "Autor" zur Gruppe verwenden, sind die Bücher in jeder Gruppe derselbe Autor. Dokumente ohne diese Domäne werden in eine separate Gruppe unterteilt.
2. Gruppenort: Gruppensortierung.
3.. Topngroups: Wie viele Gruppen bleiben beibehalten. Zum Beispiel bedeutet 10, dass nur die ersten 10 Gruppen beibehalten werden.
V. Zum Beispiel bedeutet 3, 7 Gruppen zurückzugeben (unter der Annahme von OPNGroups entspricht 10). Es ist sehr nützlich bei der Pagination, z. B. werden nur 5 Gruppen pro Seite angezeigt.
5. Mitsingroupsort: Sortieren Sie Dokumente in Gruppen. Hinweis: Der Unterschied zwischen hier und Gruppenort
6. WithGroupOffset: Suche nach welchen Dokumenten in jeder Gruppe zuerst eingestuft.
Die Gruppierung von Suchergebnissen ist einfacher für GruppingSearch
Gruppierungen -API -Dokumentation Einführung:
Convenience -Kurs für Gruppierung in einer nicht verteilten Umgebung.
Gruppierung in nicht verteilten Umgebungen
WARNUNG: Diese API ist experimentell und kann sich in der nächsten Veröffentlichung inkompatiblen Weise ändern.
Version 4.3.1 wird hier verwendet
Einige wichtige Möglichkeiten:
Beispielcode:
1. Schauen Sie sich zuerst den Indexcode an
public class IndexHelper {privates Dokument; privates Verzeichnisverzeichnis; privater Indexwriter -Indexwriter; public Directory getDirectory () {Verzeichnis = (Verzeichnis == NULL)? New RamDirectory (): Verzeichnis; Rückgabeverzeichnis; } private indexWriterConfig getConfig () {return New IndexWriterConfig (Version.lucene_43, New Ikanalyzer (True)); } private indexWriter getIndexWriter () {try {return New IndexWriter (getDirectory (), getConfig ()); } catch (ioException e) {e.printstacktrace (); null zurückkehren; }} public IndexSearcher getIndexSearcher () löscht ioException {return New IndexSearcher (DirectoryReader.open (getDirectory ())); } / ** * Index für Gruppentest * @param Autor * @param content * / public void createIdexForGroup (int id, String -Autor, String -Inhalt) {indexWriter = getIndexWriter (); document = new document (); document.add (New intField ("id", id, field.store.yes)); document.add (New StringField ("Autor", Autor, field.store.yes)); document.add (neues textfield ("content", content, field.store.yes)); try {indexWriter.adddocument (Dokument); IndexWriter.Commit (); IndexWriter.CLOSE (); } catch (ioException e) {e.printstacktrace (); }}}2. Gruppierung:
öffentliche Klasse GrouptestPublic void Group (IndexSearcher IndexSearcher, String GroupField, String -Inhalt) löst IOException, ParseException {GroupingSearch GroupingSearch = New GroupingSearch (GroupField) aus; GroupingSearch.setGroupsort (neue Sortierung (Sortfield.field_Score)); GroupingSearch.SetFillSortfields (true); GroupingSearch.SetCachingInmb (4.0, True); GroupingSearch.SetAllGroups (true); //groupingsearch.setAllGroupheads(True); GroupingSearch.SetGroupDocSlimit (10); QueryParser parser = new QueryParser (Version.lucene_43, "Inhalt", New Ikanalyzer (True)); Query query = parser.Parse (Inhalt); TopGroups <ByteRef> result = GroupingSearch.Search (IndexSearcher, Abfrage, 0, 1000); System.out.println ("Suchhits:" + result.totalHitCount); System.out.println ("Suchergebnisgruppierung:" + result.groups.length); Dokumentdokument; für (GroupDocs <ByteRef> GroupDocs: result.groups) {System.out.println ("Gruppe:" + GroupDocs.groupValue.utf8toString ()); System.out.println ("In-Gruppen-Datensatz:" + GroupDocs.totalhits); //System.out.println("groupdocs.scordecs.length: " + GroupDocs.ScordeCs.length); für (ScoredoC ScoreCOC: GroupDocs.ScordeCs) {System.out.println (IndexSearcher.doc (ScoredoC.Doc)); }}}3. Einfacher Test:
public static void main (String [] args) löst IOException, ParseException {indexHelper indexHelper = new indexHelper () aus; IndexHelper.createinNexforGroup (1, "Süßkartoffel", "Open Source China"); IndexHelper.createinNexForGroup (2, "Süßkartoffel", "Open Source Community"); IndexHelper.createinNexforGroup (3, "Süßkartoffel", "Code -Design"); IndexHelper.createinNexforGroup (4, "Süßkartoffel", "Design"); IndexHelper.CreateinNexForGroup (5, "Jiexian", "Lucene Development"); IndexHelper.CreateinNexForGroup (6, "Jiexian", "Lucene Practical Combat"); IndexHelper.CreateinDexForGroup (7, "Jiexian", "Open Source Lucene"); IndexHelper.createinNexForGroup (8, "Jiexian", "Open Source Solr"); IndexHelper.createinNexforGroup (9, "Sanxian", "Sanxian Open Source Lucene"); IndexHelper.CreateinNexForGroup (10, "Sanxian", "Sanxian Open Source Solr"); IndexHelper.CreateinNexForGroup (11, "Sanxian", "Open Source"); Grobkörnig = neuer Grouptest (); Grouptest.group (indexHelper.getInsearcher (), "Autor", "Open Source"); }} 4. Testergebnisse:
Zwei Arten des Pagens
Lucene hat zwei Arten von Paging:
1. Paginieren Sie die Suchergebnisse direkt. Diese Methode kann verwendet werden, wenn das Datenvolumen relativ gering ist. Die Kernreferenz des Paging -Codes lautet:
ScoredoC [] sd = xxx; // Abfrage Start -Rekordposition int begin = pageSize * (currentPage - 1); // Abfragen terminate repordinsposition int end = math.min (begin+pageSize, sd.Length); Für (int i = begin; i <end && i <TotalHits; i ++) {// codes codes codes codes codes codes codes suche -data} -Daten}}} Daten}} -Daten}}} codes} -Daten}}}} codes codes codes code2. Verwenden Sie SearchAfter (...)
Lucene bietet fünf Überladungsmethoden, die bei Bedarf verwendet werden können
Scoredoc nach: Reduzieren Sie die Gesamtmenge an Scoresoc für das letzte Suchergebnis um 1;
Abfrageabfrage: Abfragemethode
INT N: Die Anzahl der für jede Abfrage zurückgegebenen Ergebnisse, dh die Gesamtzahl der Ergebnisse pro Seite
Ein einfaches Beispiel für die Verwendung:
// Sie können mit MAP die erforderlichen Suchergebnisse map <String, Object> resultMap = New HashMap <String, Object> (); ScoreCoC After = null; query query = xxtopdocs td = search.Searchafter (nach, Abfrage, Größe) speichern. // Hit number resultMap.put ("num", td.totalhits); ScoredoC [] sd = td.cordecs; für (ScoredoC ScoreCOC: SD) {// klassische Suchergebnisverarbeitung} // Suchergebnisse Scoresocs Die Gesamtmenge wird um 1 nach = sd [td.scordecs.length - 1] reduziert; // speichern nach der nächsten suche, dh auf der nächsten Seite startet resultMap.put ("nach", danach); return resultMap;