为什么将Lucene的MoreLikeThis及其TermQueries限制为docFreq最高的字段?

pnwntuvh  于 2022-11-07  发布在  Lucene
关注(0)|答案(1)|浏览(150)

我目前正在修改Lucenes MoreLikeThis的版本,以满足我自己的目的。
有一件事我还是不明白。
在创建队列时,MoreLikeThis将搜索该术语的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;
}

此字段将在TermQuery中使用。这可能会产生奇怪的结果。
例如,假设你有两个字段,“title”和“body”,并且有两个文档具有完全相同的标题,但是它们不会匹配,因为所有来自“title”的单词在其他文档的“body“中出现的频率更高,反之亦然。这在我看来很奇怪。
再举一个例子:我在一个根据用户访问权限过滤结果的系统中使用了它,结果发生了这样的情况:生成查询的用户无法看到导致所选字段的高docFreq的文档。生成的查询没有找到任何文档,尽管用户可以看到很多文档,这些文档包含了准确的术语,只是在错误的字段中。
我想知道他们为什么不使用所有字段,或者至少使用术语最初出现的字段。当然,这可能是一个性能问题。但是我已经实现了它,使用原始文档中术语出现的所有字段,加上docFreq最高的字段。我在一个包含几千个文档的索引上测试了它,没有发现任何差异(但我没有做任何基准测试)。
那么,谁能告诉我为什么要这样实现它呢?我能想到的唯一原因,就是要在一个有很多字段的大索引上表现出色。
//EDIT:我实现了第一个示例以澄清问题:http://pastebin.com/fwdENb3F

brjng4g3

brjng4g31#

你应该把MoreLikeThis看作一个参考实现,它并不适合所有的应用。如果这个实现只针对一个字段,那么我们会看到这样的问题:为什么它只搜索标题字段而完全忽略了两个图书文档具有相同作者。
您可以使用setFieldNames来设置查找相似性所依据的字段。
创建您自己的MoreLikeThis版本听起来是最好的方法,特别是考虑到您需要考虑ACL。

相关问题