2

新发现后已编辑此问题

我正在使用DefaultSimilarity(TFIDF) 搜索包含 4 个文档的示例索引。当使用过滤查询时,我注意到虽然它正确地减少了结果的数量,但它并没有改变文档分数。这让我非常怀疑……

所以我扩展DefaultSimilarity打印出tf*idf 值:term_frequency, total_number_of_documents,document_frequency并且我确实确认这些值根本没有改变。我期待numDocsdocFreq反映过滤器引入的较小搜索空间。(如果你有时间阅读这里)

这是我的文档集合(文本是一个 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

不同查询之间的分数并没有真正的可比性。您在两个不同查询之间获得相同分数的事实并不是一个有意义的结果。您正在以正确的顺序获得正确的结果。他们碰巧相等的事实只是进入了实现细节。分数仅在作为同一查询的一部分返回的文档之间具有可比性。

你可以调用IndexSearcer.explain来更好地理解为什么事情会得到他们得到的分数。

于 2013-11-09T20:40:13.557 回答