4

あいまいなタイトルで申し訳ありません。これが私の問題です。次のコードを使用して、lucene 検索から結果を取得しています

scoreDoc[] hits = results.scoreDocs;
int numTotalHits = results.totalHits;
for (int i = 0; i < numTotalHits; i++) {
    int docId = hits[i].doc;
    Document d = searcher.doc(docId);
    System.out.println(i+":File name is: "+d.get("filename"));
    System.out.println(i+":File content is: "+d.get("contents"));
}

現在、このコードは、インデックスが配列の境界を超えていることを示す例外をポップアップすることがあります。だから私は以下のコードを使用しましたが、例外は発生しません

scoreDoc[] hits = results.scoreDocs;
int numTotalHits = results.totalHits;
for (int i = 0; i < numTotalHits-1; i++) {
    int docId = hits[i].doc;
    Document d = searcher.doc(docId);
    System.out.println(i+":File name is: "+d.get("filename"));
    System.out.println(i+":File content is: "+d.get("contents"));
}

これは、検索結果の数をresults.totalHits返すことを意味しますか?results.totalHits-2

ありがとうございました..

4

1 に答える 1

4

totalHitshitsは、クエリに一致するドキュメントの総数です。これは通常、配列内で得られる lucene から返されるドキュメントの数とは異なります。

何故ですか?検索エンジンについて考えてみましょう。クエリを実行すると、100 万件のドキュメントが一致しますが、1 ページで 10 ~ 20 件しか返されません。lucene から返されるのは 100 万ですが、配列totalHits内で返される上位 10 個または 20 個のドキュメントのみを lucene に要求します。hits

totalHitsがと同じ場合は 1 つだけhits.lengthです: クエリの実行時に要求したドキュメント数 (以下の例では 10) 以下のドキュメント数とクエリが一致する場合:

TopDocs results = searcher.search(query, 10);
于 2013-03-22T12:36:13.747 に答える