2016-03-29 6 views
1

Lucene hat eine neue Klasse namens QueryRescorer implementiert, die vermutlich nützlich ist, wenn Sie eine ressourcenintensivere Sortieroperation für die obersten N Lucene-Suchergebnisse implementieren möchten.Verwenden von QueryRescorer zur Neubewertung von Dokumenten

Leider verstehe ich eigentlich nicht, wie die Klasse verwendet werden soll. Hier ist die Dokumentation Seite:

http://lucene.apache.org/core/5_5_0/core/org/apache/lucene/search/QueryRescorer.html

Die primäre Methode zu sein scheint:

public static TopDocs rescore(IndexSearcher searcher, 
      TopDocs topDocs, 
      Query query, 
      double weight, 
      int topN) 

Zum Beispiel, was ist die 'Abfrage', die in übergeben wird? Die ursprüngliche Abfrage? Oder ist es eine Art sekundäre Abfrage, die bei der Neueinstufung verwendet wird?

Wenn jemand tatsächlich versteht, wie das funktioniert, wäre ich sehr dankbar für eine Erklärung.

Antwort

1

Es ist eine andere Abfrage. Die Idee des QueryRescorer ist, dass Ihr erster Durchlauf eine breit definierte Abfrage verwenden würde, die zwar gut funktioniert, aber nicht vollständig ausdrückt, wonach Sie suchen müssen. Im zweiten Durchgang verwenden Sie eine genauere, aber teurere Abfrage.

Für ein Beispiel nehmen diese Dokumente:

1 - "relevanten Testtext"
2 - "superrelevant Testtext"
3 - "ultramightyrelevant Testtext"
4 - „uninteressant Test text“
5 -‚Und viele andere Dokumente, die nichts mit dieser Abfrage zu tun haben ...‘

ich möchte für Dokumente Dokumente suchen "Relevant" und "Test Text" enthalten, aber ich will Hyperbel tolerieren, wenn ich nach "relevant" suche. Ich könnte einfach nach *relevant* "test text" fragen, aber ich weiß, dass die führende Wildcard die Suchleistung absolut morden wird. Stattdessen kann ich zunächst mit "test text", die alle vier dieser Dokumente erhalten, abfragen und dann *relevant* an den QueryRescorer übergeben, um die Bewertungen der Dokumente I wirklich wollen.

Query prequery = parser.parse("\"test text\""); 
Query postquery = parser.parse("*relevant*"); 
TopDocs docs = searcher.search(prequery, 10); 
docs = QueryRescorer.rescore(searcher, docs, postquery, 2, 10); 
+0

Cool, das macht jetzt Sinn. Vielen Dank! –

Verwandte Themen