Java 为什么要限制Lucene';更像是这样';s TERM查询到docFreq最高的字段?

Java 为什么要限制Lucene';更像是这样';s TERM查询到docFreq最高的字段?,java,lucene,information-retrieval,term,morelikethis,Java,Lucene,Information Retrieval,Term,Morelikethis,我目前正在开发一个修改版的Lucenes MoreLikeThis,以符合我自己的目的。 有一件事我还是不明白。 创建队列时,moreliketh将搜索此术语具有最高docFreq的字段 // go through all the fields and find the largest document frequency String topField = fieldNames[0]; int docFreq = 0; for (int i = 0; i < fieldNames.len

我目前正在开发一个修改版的Lucenes MoreLikeThis,以符合我自己的目的。 有一件事我还是不明白。 创建队列时,moreliketh将搜索此术语具有最高docFreq的字段

// go through all the fields and find the largest document frequency
String topField = fieldNames[0];
int docFreq = 0;
for (int i = 0; i < fieldNames.length; i++) {
   int freq = ir.docFreq(new Term(fieldNames[i], word));
   topField = (freq > docFreq) ? fieldNames[i] : topField;
   docFreq = (freq > docFreq) ? freq : docFreq;
}
//检查所有字段并找到最大的文档频率
字符串topField=fieldNames[0];
int-docFreq=0;
对于(int i=0;idocFreq)?字段名[i]:topField;
docFreq=(频率>docFreq)?频率:docFreq;
}
此字段将在TermQuery中使用。这会产生奇怪的结果

例如,假设您有两个字段“title”和“body”,并且有两个标题完全相同的文档,但它们不匹配,因为“title”中的所有单词在其他文档“body”中出现的频率更高,反之亦然。我觉得这很奇怪

另一个例子:我在一个系统中使用它,该系统通过依赖于用户的访问权限过滤结果,但碰巧生成查询的用户看不到负责所选字段的高docFreq的文档。生成的查询没有找到任何文档,尽管用户可以看到很多文档,其中包含确切的术语,只是在错误的字段中

我想知道为什么他们不使用所有字段,或者至少使用术语最初出现的字段。 当然,这可能是性能问题。但是我实现了它,使用原始文档中出现术语的所有字段,加上docFreq最高的字段。我在一个包含数千个文档的索引上测试了它,没有发现任何差异(但我没有做任何基准测试)

那么,有人能告诉我为什么要这样实施吗? 我能想到的唯一原因,就是在一个有很多字段的大指数上表现出色


//编辑:我实现了第一个示例以澄清问题:

您应该将
更多类似于此
视为不适合所有用途的参考实现。 如果实现只针对一个字段,那么我们将看到这样的问题:为什么只搜索标题字段而完全忽略了两个图书文档具有相同作者。
您可以使用设置要根据哪些字段查找相似性


创建自己版本的
morelike这听起来是最好的方法,特别是考虑到您需要考虑ACL。

感谢您的回答。使用setFieldNames只允许您指定要考虑的字段,因此它仍将使用docFreq值最高的字段。我只是对“为什么”很好奇,但它在大多数情况下似乎都很有效,所以我想我应该接受它;)