- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我目前正在研究 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”中的所有单词出现的频率更高在其他文档中为“正文”,反之亦然。这对我来说似乎很奇怪。
另一个例子:我在一个系统中使用它,该系统通过用户相关的访问权限过滤结果,并且碰巧生成查询的用户看不到负责高 docFreq 的文档选择的领域。生成的查询没有找到任何文档,尽管用户可以看到很多文档,其中包含确切的术语,只是在错误的字段中。
我想知道为什么他们不只使用所有字段,或者至少使用最初出现术语的字段。当然,这可能是性能问题。但我已经实现它以使用原始文档中出现术语的所有字段,加上具有最高 docFreq 的字段。我在包含数千个文档的索引上对其进行了测试,没有发现任何差异(但我没有做任何基准测试)。
那么,有人能告诉我为什么要这样实现吗?我能想到的唯一原因是在具有很多字段的非常大的索引上表现出色。
//编辑:我实现了第一个例子来澄清问题:http://pastebin.com/fwdENb3F
最佳答案
您应该将 MoreLikeThis
视为不适合所有用途的引用实现。如果实现只针对一个字段,那么我们将看到这样的问题:为什么它只搜索标题字段而完全错过了两本书文档具有同一作者。
你可以使用 setFieldNames设置要查找相似性的字段。
创建您自己的 MoreLikeThis
版本听起来是最好的方法,尤其是考虑到您需要考虑 ACL。
关于java - 为什么将 Lucene 的 MoreLikeThis 及其 TermQueries 限制在 docFreq 最高的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13500066/
我正在使用 Lucene 3.1 来索引一些文档。 当我使用 IndexSearcher.search() 时,我成功地获得了查询结果。 但是,当我使用 IndexSearcher.doqFreq()
我目前正在研究 Lucenes MoreLikeThis 的修改版本,以适应我自己的目的。 有一件事我还是不明白。 在创建队列时,MoreLikeThis 会搜索该术语的 docFreq 最高的字段。
我是一名优秀的程序员,十分优秀!