2016-07-29 8 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の文書を無視しますか?

スコアに関係なく、インデックス内のすべてのドキュメントを取得するにはどうすればよいですか?

+0

このクエリは、インデックス内のすべてのドキュメントに一致すると思われますか?または、クエリに一致するかどうかにかかわらずすべてのドキュメントを返すようにしますか? – femtoRgon

+0

すべての書類を返送したい。次に、スコアに基づいてランク付けし、不一致の文書が最下位になるようにします。 – KillBill

+0

@KillBill IndexSearcher :: searchのコードを見ると、maxScoreに基づいてドキュメントを返さない可能性があります。新しいTopDocs(totalHits、scoreDocs、maxScore)を返します。だから私はTopDocsのsearchAfter(ScoreDocの後に、クエリクエリ、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

それは感謝を働いた!しかし、私はこれらの2つの風景をよく理解しているとは思わない。ルーネンはクエリがドキュメントと一致するかどうかをどのように判断するのですか?それは類似性スコアに基づいていますか?その場合、前のケースでは、luceneはそのしきい値を超えてドキュメントを返すだけのしきい値をどのように決定しますか? – KillBill

+0

@KillBill - 逆インデックスで一致するものを探します。ハッシュテーブルの仕組みと似たようなものです。一般的に、特定の検索でインデックス内の用語(またはドキュメント)のほとんどに触れる必要はありません。 – femtoRgon

関連する問題