欢迎访问优讯网!
您当前的位置:首页 > 爱编程

elasticsearch should 和must 共存时 should失效问题

时间:2019-10-08 08:13:03  来源:优讯网  作者:小卡司  浏览次数:

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

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

所以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);


搜索结果

 

例如在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失效问题
的全部内容了,喜欢的小伙伴别忘了点赞分享一下哦,
关注优讯网,优讯有你更精彩!

转载自: https://my.oschina.net/u/4054187/blog/3114098
版权归原作者所有,如有侵权请联系我们删除。

来顶一下
返回首页
返回首页
推荐资讯
计算机的正确使用姿势 电脑痴如何正确的使用电脑
计算机的正确使用姿势
好用的后台管理的前端框架模版H-ui H-ui框架模版分享
好用的后台管理的前端
微信电脑多开方法 无需辅助电脑版微信双开方法分享
微信电脑多开方法 无
Python实现网站百度主动推送 python实现主动推送网站地图
Python实现网站百度主
相关文章
栏目更新
栏目热门