Java Lucene过滤器似乎没有按预期改变查询搜索空间(由我)

Java Lucene过滤器似乎没有按预期改变查询搜索空间(由我),java,lucene,tf-idf,lucene-filters,Java,Lucene,Tf Idf,Lucene Filters,这个问题是在新发现后编辑的 我正在使用DefaultSimilarity(TFIDF)搜索包含4个文档的示例索引。当使用过滤查询时,我注意到,虽然它正确地减少了结果的数量,但不会改变文档的分数。这让我很怀疑 因此,我扩展了DefaultSimilarity来打印tf*idf值:term\u frequency、total\u number\u of\u of\u documents,我确实确认这些值根本没有改变。我希望numDocs和docFreq能够反映过滤器引入的较小搜索空间。(如果有时间,

这个问题是在新发现后编辑的

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

因此,我扩展了
DefaultSimilarity
来打印
tf*id
f值:
term\u frequency
total\u number\u of\u of\u documents
,我确实确认这些值根本没有改变。我希望
numDocs
docFreq
能够反映过滤器引入的较小搜索空间。(如果有时间,请阅读)

这是我的文档集合(文本是文本字段):

当我搜索“黑色”时:

我得到了预期的
numDocs=4
docFreq=3

然后,我尝试通过以下方式减少搜索空间:

(一)

(二)

(三)

我总是得到相同的numDocs和docFreq值。(
而不是numDocs=2和docFreq=1
,因为搜索空间应该减少到2个文档,其中只有1个包含“黑色”)

这些值似乎是在创建索引时预先计算的,或者是在查询返回后应用过滤器。我对这两种选择都不满意

应用过滤器后,如何让Lucene计算这些值


完整的gist得分在不同的查询中并不具有可比性。在两个不同的查询之间得到相同的分数这一事实并不是一个真正有意义的结果。您正在以正确的顺序获得正确的结果。它们恰好相等这一事实正好涉及到实现细节。分数仅在作为同一查询的一部分返回的文档之间具有可比性


你可以打电话,更好地了解事情为什么会得到分数。

谢谢,但我对本案例的内部细节感兴趣。:)不应在查询之间比较分数,因为它们可能会因几个不同的因素而改变。在本例中,我有3个不同的查询,它们产生相同的分数,这很奇怪。我知道DefaultSimilarity是如何工作的,过滤后的结果分数与它背后的实现不匹配。我相信过滤器是在查询之后应用的(这将证明分数的合理性),我希望相反的行为。另外,是否有IndexSearcher.explain等效于解释过滤器或过滤查询?
IDF(t)=1+log(numDocs/(docFreq+1))
是IDF计算,因此我们有
1+log(2/2)=1+log(4/4)=1
。根据中给出的算法,IDF评分元素应该是相等的,我没有看到任何会导致tf、querynorm、coord、boost或norm差异的东西。这两个过滤后的查询应该完全相同。感谢您的跟进!我同意“黑色”这个词!以下是我对regularQuery与filteredQuery的计算:IDF(黑色)=1+log(4/3+1)=1+log(2/1+1)=1。请注意,numDocs和docFreq的变化方式导致“黑色”的idf相同。那“狗”呢?不应该1+记录(4/1+1)!=1+日志(2/1+1)?在考虑4个文档的搜索空间时,Dog更为罕见,对于常规查询,应该具有更高的idf。我不太了解其他得分要素,你认为它们是否会以某种方式使两个得分完全相同?明天将进行更多的测试。是的,很好,说实话,我没有考虑那个术语,因为它看起来不那么有趣。我的错误。给人的印象是过滤器的限制不会影响IDF评分。可能是queryNorm导致了这种情况,因为它的目的是让分数更具可比性,而我还没有完全意识到这一点。不过,我对此表示怀疑。等我有机会对它进行一些修补时,可能不得不回到这个问题上来。我发现了一些东西,并相应地更新了我的问题。我的实验要点如下:
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);
PrefixFilter prefixFilter = new PrefixFilter(new Term("type", "type.colors"));
TopDocs results = searcher.search(query, prefixFilter, 5);
PrefixQuery categoryQuery = new PrefixQuery(new Term("type", "type.colors"));
QueryWrapperFilter categoryFilter = new QueryWrapperFilter(categoryQuery);
TopDocs results = searcher.search(query, categoryFilter, 5);
BooleanQuery booleanQuery = new BooleanQuery();
booleanQuery.add(new PrefixQuery(new Term("type", "type.colors")), Occur.MUST);
booleanQuery.add(blackQuery, Occur.MUST);