调整Lucene得分

时间:2018-12-02 19:25:52

标签: java lucene scoring

我在这里查看了其他Lucene得分问题,但似乎没有一个问题能解决我的问题。

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

例如,当我搜索“气泡花”时,我发现,如果其中一个单词在给定的Document中出现两次,我会感到有点惊讶,这被算作“就像“在同一个Document中找到两个搜索词(即“气泡”和“花朵”)一样好。

在包含1 x“气泡”和1 x“ bloom”的Document之前,还将列出包含3个单词“ bubble”的Document(10行集)。而带有两个“气泡”的一个似乎与两个词都等于Document

注意String这样的“泡泡花”似乎由BooleanQuery做成带有两个子句的QueryParser.parse()

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

顺便说一句,PS,我只是在搜索字符串为“ + bubble + bloom”的情况下进行了搜索...显然,这排除了缺少一个单词的任何Document。但是我认为这是一种解决方法。我希望不带“ +”(表示“ require”)的默认功能可以使所有术语的出现都得分更高。

1 个答案:

答案 0 :(得分:0)

很明显,TF-IDF或BM25评分非常依赖于索引中各项的分布,例如,因为我能够使包含“气泡溢出”的文档高于任何文档,但是最有可能只是我的测试分发版

有多种方法可以以标准方式实现这一目标。最简单的方法之一是使用 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查询,因此您与它们中的任何一个都有匹配项。明显的问题是气泡花朵的匹配相等。这可能也有一些警告。

完整代码的链接为there