2

この質問は、新しい発見後に編集されました

(TFIDF) を使用しDefaultSimilarityて、4 つのドキュメントでサンプル インデックスを検索しています。フィルター処理されたクエリを使用すると、結果の数は正しく減りますが、ドキュメントのスコアは変わらないことに気付きました。これは非常に疑問に思いました...

そこで、 、、およびのf 値をDefaultSimilarity出力するように拡張し、実際にこれらの値がまったく変化しないことを確認しました。フィルターによって導入されたより小さな検索スペースを反映することを期待していました。(お時間のある方はこちらをお読みください)tf*idterm_frequencytotal_number_of_documentsdocument_frequencynumDocsdocFreq

これは私のドキュメント コレクションです (テキストは TextField です)。

id=0 type=type.colors title=This is a black dog
id=1 type=type.pets title=This is a black cat
id=2 type=type.colors title=The cat is white
id=3 type=type.pets title=The cat is black

「黒」で検索すると、

Query query = parser.parse("black");
TopDocs results = searcher.search(query, 5);

私は期待どおりに取得numDocs=4docFreq=3ます。

次に、次の方法で検索スペースを削減しようとしました。

1)

PrefixFilter prefixFilter = new PrefixFilter(new Term("type", "type.colors"));
TopDocs results = searcher.search(query, prefixFilter, 5);

2)

PrefixQuery categoryQuery = new PrefixQuery(new Term("type", "type.colors"));
QueryWrapperFilter categoryFilter = new QueryWrapperFilter(categoryQuery);
TopDocs results = searcher.search(query, categoryFilter, 5);

3)

BooleanQuery booleanQuery = new BooleanQuery();
booleanQuery.add(new PrefixQuery(new Term("type", "type.colors")), Occur.MUST);
booleanQuery.add(blackQuery, Occur.MUST);

そして、numDocs と docFreq の値は常に同じになります。(instead of numDocs=2 and docFreq=1検索スペースは 2 つのドキュメントに削減され、そのうちの 1 つだけに「黒」が含まれているため);

これらの値は、インデックスの作成時に事前に計算されているか、クエリが返された後にフィルターが適用されているようです。私はどちらの選択肢にも満足していません...

フィルターが適用された後、Lucene にこれらの値を計算させるにはどうすればよいですか?

完全な要旨はこちら

4

1 に答える 1

1

異なるクエリ間でスコアを実際に比較することはできません。2 つの異なるクエリ間で同じスコアが得られるという事実は、実際には意味のある結果ではありません。正しい順序で正しい結果が得られます。それらがたまたま等しいという事実は、実装の詳細に入ります。スコアは、同じクエリの一部として返されたドキュメント間でのみ比較できます。

IndexSearcer.explainを呼び出すと、取得したスコアが得られる理由をよりよく理解できます。

于 2013-11-09T20:40:13.557 に答える