调整 Lucene 评分

Tweak Lucene scoring

我在这里查看了其他 Lucene 评分问题,但 none 似乎涵盖了我的问题。

我正在为一些大型 Word 文件编制索引。这些文件中的行被拆分,文件中的每 10 行被制成一个 Lucene Document(实际上它们重叠 10 行 Documents,但这不相关)。

例如,当我在 "bubble bloom" 上进行搜索时...我发现,令我略感惊讶的是,如果这些词中的一个在给定的 Document 中出现两次,那么它被认为是非常好的就像 "just as good as" 在同一个 Document 中找到两个搜索词(即 "bubble" 和 "bloom")一样。

此外,包含单词 "bubble" 的 3 个实例的 Document(一组 10 行)将列在包含 1 x "bubble" 和 1 x 的 Document 之前"bloom"。一个有 2 x "bubble" 的词似乎被算作等于 Document 和两个词。

NB a String 像这样,"bubble bloom" 似乎会被 QueryParser.parse().

做成一个有两个子句的 BooleanQuery

是否有任何方法可以调整事情,以便在 Document 中找到两个词(搜索词)的事实排名 Document 比找到其中一个词的 2 或 3 个实例更高,但另一个为零?

PS 顺便说一下,我刚刚进行了一次搜索,搜索字符串是“+bubble +bloom”……显然这排除了任何缺少一个词的 Document。但我认为这是一种解决方法。我想要没有“+”的默认功能(对于 "require"),以便对所有术语都存在的事实进行评分。

很明显,TF-IDF 或 BM25 评分非常依赖于索引中术语的分布,因为例如我能够让包含 "bubble bloom" 的文档高于任何文档,但是这很可能只适用于我的测试发行版

有多种不同的方法可以以标准方式实现这一点。最简单的方法之一是使用 ConstantScoreQuery,对于一个或多个术语匹配项,它始终会给您 1.0(或任何其他任意数字)的分数。结合 BooleanQuery 进行求和,您可以轻松地根据文档中的术语数量对文档进行评分。

例如

Query query = new BooleanQuery.Builder()
            .add(new ConstantScoreQuery(new TermQuery(new Term("text", "bloom"))), BooleanClause.Occur.SHOULD)
            .add(new ConstantScoreQuery(new TermQuery(new Term("text", "bubble"))), BooleanClause.Occur.SHOULD)
            .build();

这仍然是 OR 查询,因此您与其中任何一个都匹配。这一个的明显问题是 bubblebloom 的匹配相等。这可能也有一些注意事项。

完整代码的 link 是 there