我在这里查看了其他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”)的默认功能可以使所有术语的出现都得分更高。
答案 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