新发现后已编辑此问题
我正在使用DefaultSimilarity
(TFIDF) 搜索包含 4 个文档的示例索引。当使用过滤查询时,我注意到虽然它正确地减少了结果的数量,但它并没有改变文档分数。这让我非常怀疑……
所以我扩展DefaultSimilarity
打印出tf*id
f 值:term_frequency
, total_number_of_documents
,document_frequency
并且我确实确认这些值根本没有改变。我期待numDocs
并docFreq
反映过滤器引入的较小搜索空间。(如果你有时间阅读这里)
这是我的文档集合(文本是一个 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=4
,docFreq=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 计算这些值?
完整的要点在这里