2016-04-18 5 views
0

Wir haben einige Tests mit Lucene.Net 3.0.3 in Bezug auf Suchen und Einfügen durchgeführt.Lucene Suchleistung - DOC vs DEFAULT Sortierung

Für die Tests verwendeten wir einen Keyword-Analyzer und Textgenerator basierend auf echten englischen Wörtern.

Wenn der Index bei der Suche nach 1000 zufälligen Sätzen ungefähr 8 Millionen Dokumente erreicht, dauert es 25 Minuten, bis die Suche abgeschlossen ist. (Standard-Sortierung)

Wenn wir die Suche ändern Sortierung zu dokumentieren:

searcher.Search(query, null, int.MaxValue, new Sort(new SortField(null, SortField.DOC, true))); // boolean query 

Die Suche dauert nur wenige Sekunden.

Was gibt? Ist die Standardsortierung auf Relevanz basiert? Warum hat es so große Auswirkungen?

Wenn wir die Anzahl der Treffer von int.MaxValue auf 50 reduzieren, wird auch die Suche auf einige Sekunden reduziert.

Nimmt nur die ersten 50 Treffer im Index und ignoriert den Rest?

Antwort

1

Ich glaube, Ihre Vermutung ist richtig, wenn Sie in Doc-ID-Reihenfolge sortieren, muss es nicht jedes übereinstimmende Dokument, sondern stattdessen Kurzschluss finden, wenn es genug Dokumente gefunden hat, die übereinstimmen, im Gegensatz zu Partitursortierung wo jeweils Das Dokument muss bewertet werden, um zu wissen, welche die besten Übereinstimmungen sind.

Scheint wie die Frage, die Sie fragen sollten, obwohl, warum dauert es so lange zu suchen überhaupt?

Basierend auf dem, was Sie geschrieben haben, ich denke, ich kann erraten: Sie sollten nicht KeywordAnalyzer für Volltext verwenden. Klingt so, als würde man Volltext als Schlüsselwörter indizieren und dann nach Sätzen suchen, wahrscheinlich mit doppelten Platzhaltern oder Regexes oder etwas ähnlichem. Hör auf damit. Du könntest Lucene einfach vergessen und eine gute altmodische sequenzielle Suche programmieren, denn das zwingst du Lucene dazu, es trotzdem zu tun. Verwenden Sie einen Analysator, der Ihre Suchanforderungen tatsächlich erfüllt (StandardAnalyzer oder sind gute Startpunkte), und verwenden Sie Phrasenabfragen, um nach Phrasen oder Sätzen zu suchen.

+0

In diesem speziellen Fall indexiere ich den vollständigen Text mit dem Schlüsselwort analyzer in einem Feld und mit dem Standardanalyseprogramm in einem anderen Feld. Wenn die eingehende Suche zu 100% genau sein muss, suche ich nach dem spezifischen Feld, das vom Keyword-Analyzer indiziert wird. Wie würden Sie diesen Fall angehen? –

+0

@pelican_george - Was meinst du mit 100% genau? Wenn Sie meinen, dass die Abfrage mit dem * gesamten Text * des Feldes übereinstimmen muss, ist eine Keyword-Analyse sinnvoll. Wenn Sie meinen, dass die Abfrage genau mit einem Teil des Feldes übereinstimmen muss (wenn Sie in Ihrer aktuellen Abfrage Platzhalter verwenden müssen), wäre eine PhraseQuery mein erster Gedanke. Andere Ansätze zur Analyse könnten ebenfalls nützlich sein. – femtoRgon

+0

Ich meine, die Abfrage muss mit dem gesamten Text des Feldes übereinstimmen. Danke für die Eingabe. –