调整 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 查询,因此您与其中任何一个都匹配。这一个的明显问题是 bubble 或 bloom 的匹配相等。这可能也有一些注意事项。
完整代码的 link 是 there
我在这里查看了其他 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 查询,因此您与其中任何一个都匹配。这一个的明显问题是 bubble 或 bloom 的匹配相等。这可能也有一些注意事项。
完整代码的 link 是 there