首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Elasticsearch如何替换"terms“查询?

Elasticsearch如何替换"terms“查询?
EN

Stack Overflow用户
提问于 2019-02-05 07:54:34
回答 1查看 592关注 0票数 0

使用版本6之前的Elasticsearch,以下查询根据与查询的相似度返回命中结果。现在在ES 6+中,这将根据它们是否匹配查询的任何部分来返回命中,所有这些都具有相同的分数。此更改中断了更复杂查询的其余部分(未显示)。

对于以下查询,如何获得与较旧的ES 5匹配的命中分数

代码语言:javascript
复制
{
  "query": {
    "bool": {
      "should": [
        {
          "terms": {
            "some_field_name": [
              "iPad Pro",
              "iPhone 8"
            ]
          }
        }
      ]
    }
  }
}

在ES 5中,这返回匹配所有术语的命中率较高,匹配较少的命中率较低。在ES 6+中,这只返回得分=1的命中结果,因此它们的排名不考虑有多少匹配的术语。

例如,同时包含这两个术语的命中在ES 5中排名更高:

代码语言:javascript
复制
"_score": 0.87546873, when 2 of 4 terms match
"_score": 0.60353506, when 2 of 5 terms match
"_score": 0.13353139, when 1 of 4 terms match

这很像我们所需要的“余弦”相似性(请理解,这并不是分数的精确创建方式)。

哪个查询返回的分数与ES5对上述查询返回的分数相同。换句话说,什么是ES 6等价查询?

EN

回答 1

Stack Overflow用户

发布于 2019-02-06 15:43:46

注:由于评论中的讨论变得越来越长和笨拙,所以只是将其作为建议草案发布。

更新:我刚刚检查了我推荐的两种方法,两种方法似乎都给出了相似的分数。请尝试这些方法,看看您获得的分数是否与您相关。

我知道它不适用于术语,但我建议将其替换为多个“术语”过滤器,该过滤器也具有boost参数,或者将其替换为"term_set“查询,并将required_matches参数设置为"1”,因为我们需要“或”行为。

1)使用terms_set查询:

代码语言:javascript
复制
{
  "query": {
    "bool": {
      "should": [
        {
          "terms_set": {
            "some_field_name": {
             "terms" : ["iPad Pro", "iPhone 8"],
             "minimum_should_match_script": {
                "source": "1"
              } 

            }
          }
        }
      ]
    }
  }
}

2)使用多项过滤器,而不是单项过滤器:

代码语言:javascript
复制
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "some_field_name": "iPad Pro"
          }
        },
        {
          "term": {
            "some_field_name": "iPhone 8"
          }
        }
      ]
    }
  }
}

如果你在术语中使用boost,那么你应该在每个术语块中应用相同的boost。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54526023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档