gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:26:06 26 4
gpt4 key购买 nike

我目前正在研究 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com