温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么解决elasticsearch should和must共存时should失效的问题

发布时间:2021-06-26 14:23:13 来源:亿速云 阅读:977 作者:chen 栏目:大数据

这篇文章主要介绍“怎么解决elasticsearch should和must共存时should失效的问题”,在日常操作中,相信很多人在怎么解决elasticsearch should和must共存时should失效的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么解决elasticsearch should和must共存时should失效的问题”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

再使用must和should混合查询的时候,发现should并不起作用。

如a==1时搜索b=1或者b=2的数据,按照编程语言的逻辑则是在a=1的条件下必须满足b=1或者b=2,

所以must和should平级的写法是错误的。

注意错误写法

怎么解决elasticsearch should和must共存时should失效的问题

根据搜索结果可以发现should并未起作用

正确写法

$params = [
            'index' => 'news',
            'type' => '_doc',
            'body' => [
                'query' => [
                    'bool' => [
                        'must' => [
                            ['match' => ['age' => 50]],
                            ['bool' => [
                                'should' => [
                                    ['match' => ['content' => '西红柿']],
                                    ['match' => ['content' => '中国和美国']]
                                ]
                            ]]
                        ]
                    ]
                ]
            ]
        ];
        $result = $this->es->search($params);
        var_dump($result);


搜索结果

怎么解决elasticsearch should和must共存时should失效的问题

例如在a=1且b=2的数据中,找出c=1或者d=2的数据:

{"query": {
   "bool": {
  "must": [
     {"term": {"a": "1"}},
       {"term":{"b": "2"}}
  ],
   "should": [
      {"term": {"c": "1"}},
    {"term": {"d": "2"}}
  ]
    }
  }
}
这样写的时候should是没有用的,这是新手可能犯的错误之一。 在编写查询条件的时候,不能用口头上的逻辑进行编写,而是要换成数学逻辑才能进行执行(数据库同理)。 如上例,数学逻辑应该是 (a==1&&b==2&&c==1)||(a==1&&b==2&&d==2),这样的结构去查询。
{"query": {
   "bool": {
  "should": [
     {"term": {"a": "1"}},
       {"term":{"b": "2"}},
       {"term": {"c": "1"}}
  ],
   "should": [
      {"term": {"a": "1"}},
      {"term":{"b": "2"}},
   {"term": {"d": "2"}}
  ]
    }
  }
}
思路就是以上那样,具体写法有2种:
{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
                {"term": {"a": "1"}},
                {"term":{"b": "2"}},
                {"term": {"c": "1"}}
            ]
          }
        },
        {
          "bool": {
            "must": [
                {"term": {"a": "1"}},
                {"term":{"b": "2"}},
              {"term": {"d": "2"}}
            ]
          }
        }
      ]
    }
  },
  "sort": {
    "time": {
      "order": "desc"
    }
  },
  "size": 100
}
或者:
{
  "query": {
    "bool": {
      "must": [
        {"term": {"a": "1"}},
        {"term":{"b": "2"}}
        {
          "bool": {
            "should": [
                {"term": {"c": "1"}},
              {"term": {"d": "2"}}
            ]
          }
        }
      ]
    }
  },
  "sort": {
    "time": {
      "order": "desc"
    }
  },
  "size": 100
}

到此,关于“怎么解决elasticsearch should和must共存时should失效的问题”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI