2016-07-29 8 views
0

Ich benutze Lucene 5.3, um eine Reihe von Dokumenten zu indexieren und zu verwenden, wobei jeder Begriff in der Abfrage um ein gewisses Ergebnis erhöht wird.warum Lucene nicht alle Dokumente im Index zurückgibt?

Mein Problem ist, wenn ich den Index suche ich eine geringere Anzahl von Dokumenten als Treffer als das sind in meinem Index.

System.out.println("docs in the index = " + reader.numDocs()); 
    //e.g., docs in the index = 92 
    TopDocs topDocs = indexSearcher.search(q, reader.numDocs()); //this ensures no result is omitted from the search. 
    ScoreDoc[] hits = topDocs.scoreDocs; 
    System.out.println("results found: " + topDocs.totalHits) 
    //e.g., results found: 44 

Was ist der Grund für dieses Verhalten? Ignoriert Lucene Dokumente mit einem Nullpunktestand?

Wie bekomme ich alle Dokumente im Index, egal welche Punktzahl sie haben?

+0

Erwarten Sie, dass diese Abfrage alle Dokumente in Ihrem Index übereinstimmen? Oder möchten Sie, dass alle Dokumente zurückgegeben werden, unabhängig davon, ob sie mit der Abfrage übereinstimmen oder nicht? – femtoRgon

+0

Ich möchte alle Dokumente zurückgeben. Ich werde sie dann basierend auf der Punktzahl ordnen, so dass die nicht übereinstimmenden Dokumente die Unterseite sein werden. – KillBill

+0

@KillBill Betrachtet man den Code in IndexSearcher :: search (Gewichtung, ScoreDoc nach, int nDocs), könnte es sein, dass Docs auf Basis des maxScore nicht zurückgegeben werden: return new TopDocs (totalHits, scoreDocs, maxScore); Also würde ich TopDocs searchAfter verwenden (ScoreDoc nach, Query Abfrage, int n). –

Antwort

0

Lucene gibt nur Ergebnisse zurück, die tatsächlich mit der Abfrage übereinstimmen. Wenn Sie alle Dokumente als Ergebnisse erhalten möchten, müssen Sie sicherstellen, dass alle übereinstimmen. Sie können dies mit einem MatchAllDocsQuery tun:

Query query = new BooleanQuery.Builder() 
     .add(new BooleanClause(new MatchAllDocsQuery(), BooleanClause.Occur.MUST)) 
     .add(new BooleanClause(myOldQuery, BooleanClause.Occur.SHOULD)) 
     .build(); 
+0

Ich werde es versuchen und aktualisieren Sie – KillBill

+0

es hat funktioniert, danke! aber ich denke nicht, dass ich diese 2 scenerios gut verstehe. Wie ermittelt Lucene, ob eine Anfrage mit einem Dokument übereinstimmt oder nicht? Basiert es auf dem Ähnlichkeits-Score? Wenn ja, wie bestimmt Lucene diesen Schwellenwert, wenn er nur Dokumente über diesen Schwellenwert zurückgibt? – KillBill

+0

@KillBill - Es sucht nach Übereinstimmungen in einem invertierten Index. Es ist ähnlich wie eine Hash-Tabelle funktioniert. Im Allgemeinen sollte es die meisten Begriffe (oder Dokumente) im Index bei einer bestimmten Suche nicht berühren müssen. – femtoRgon