【问题标题】:Tweak Lucene scoring调整 Lucene 评分
【发布时间】:2019-05-04 03:48:16
【问题描述】:

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

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

例如,当我搜索“泡沫绽放”时......我发现,令我有点惊讶的是,如果其中一个词在给定的Document 中出现两次,它几乎被视为“就像就像”在同一个Document 中找到两个搜索词(即“bubble”和“bloom”)。

另外,包含 3 个单词“bubble”实例的 Document(10 行)将列在包含 1 个“bubble”和 1 个“bloom”的 Document 之前。一个带有 2 x“气泡”的单词似乎与带有两个单词的 Document 相等。

注意像这样的String,“泡沫绽放”似乎会被QueryParser.parse() 变成带有两个子句的BooleanQuery

有没有办法调整事情,以便在 Document 中找到两个词(搜索词)这一事实将 Document 排名高于找到其中一个词的 2 或 3 个实例,但另一个词的实例为零?

顺便说一句,我刚刚进行了一次搜索,其中搜索字符串为“+bubble +bloom”...显然这不包括缺少一个单词的任何Document。但我认为这是一种解决方法。我希望没有“+”(代表“require”)的默认功能能够对所有术语都存在更高的事实进行评分。

【问题讨论】:

    标签: java lucene scoring


    【解决方案1】:

    很明显,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 的匹配是相等的。这可能也有一些注意事项。

    完整代码的链接是there

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 2010-09-05
      • 2010-12-13
      • 1970-01-01
      • 1970-01-01
      • 2016-09-12
      • 1970-01-01
      相关资源
      最近更新 更多