【问题标题】:Elasticsearch: Constant score applied within match query, but after search terms have been analysed?Elasticsearch:在匹配查询中应用恒定分数,但在分析搜索词之后?
【发布时间】:2018-07-27 09:54:20
【问题描述】:

假设我有一些文档,在名为 name 的文本字段中包含以下值

  • 文档1:abc xyz group
  • 文档2:group x/group y
  • 文档3:group 1, group 2, group 3, group 4

现在想象一下,我正在向 ES 发送一个简单的匹配查询以获取术语“组”:

{
    "query": {
        "match": {
            "name": "group"
        }
    }
}

我想要的结果是所有 3 个文档都将以相同的分数返回,无论该术语出现的频率如何,出现在何处等等。 现在,我已经知道我可以做到这一点,方法是用 constant_score 包裹我的 match,如下所示:

{
    "query": {
        "constant_score": {
            "filter": {
                "match": {
                    "name": "group"
                }
            },
            "boost": 1
        }            
    }
}

但是,假设我现在想使用搜索词 abc group 进行查询。在这种情况下,我想要发生的是 Document2 和 Document3 将返回相同的分数(匹配 group),但 Document1 的分数更高,因为它同时匹配 abcgroup

使用 constant_score 包装我的 match 查询,包含任何术语的文档返回相同的分数(即 Document1、2 和 3 为 abc group 返回相同的分数)。如果我删除了constant_score,那么文档 3 的得分最高可能是因为它包含更多与搜索文本的匹配项(group 出现了 4 次)。

似乎在match 查询分析了我的搜索文本之后,我需要一种将constant_score 查询移动到的方法。有效地导致abc group 的查询成为两个constant_score 查询——一个用于abc,一个用于group

有谁知道实现这一目标的方法吗?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    我已经通过使用 Elasticsearch 的 unique 令牌过滤器解决了这个问题:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-unique-tokenfilter.html

    我已将它添加到索引映射中的 name 字段中,它看起来正在检索所需的结果,而不必担心 constant_score

    请注意,所有这些都是为了消除词频对_score 的任何影响——其他指标(例如fieldLength)仍然对结果有影响。因此,这并不等同于使用我在问题中假设的 constant_score 的后分析版本,但这足以满足我当前的要求。

    【讨论】:

      猜你喜欢
      • 2018-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      • 2018-02-25
      • 2019-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多