2016-07-29 89 views
0

我正在使用Lucene 5.3來索引一組文檔,並使用BooleanQuery,其中查詢中的每個術語都被某個分數提升。爲什麼lucene不會返回索引中的所有文檔?

我的問題是,當我搜索索引時,我得到的文檔數量少於點擊數,而我的索引數量很少。

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 

這種行爲的原因是什麼? lucene是否忽略零分的文檔?

如何獲得索引中的所有文檔,無論他們擁有什麼分數?

+0

你是否期待這個查詢匹配索引中的所有文檔?或者是否希望它返回所有文檔,而不管它們是否與查詢匹配? – femtoRgon

+0

我想返回所有文檔。然後,我會根據分數對它們進行排名,因此不匹配的文檔將成爲底部。 – KillBill

+0

@KillBill查看IndexSearcher :: search中的代碼(Weight weight,ScoreDoc after,int nDocs)可能有可能無法根據maxScore返回文檔:return new TopDocs(totalHits,scoreDocs,maxScore);所以我會使用TopDocs searchAfter(ScoreDoc after,Query query,int n)。 –

回答

0

Lucene將只返回實際匹配查詢的結果。如果你想獲得所有的文件作爲結果,你需要確保它們都匹配。你可以用MatchAllDocsQuery來做到這一點:

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

我會試一試並更新你的 – KillBill

+0

它的工作表示感謝!但我不認爲我很好理解這兩個scenerios。那麼lucene如何確定查詢是否匹配文檔;它是基於相似性分數嗎?如果是這樣的話,那麼lucene如何確定只返回高於閾值的文檔的閾值? – KillBill

+0

@KillBill - 它在倒排索引中查找匹配。它有點類似於哈希表的工作方式。通常,在給定的搜索中,它不應該涉及索引中的大部分術語(或文檔)。 – femtoRgon

相關問題