这篇文章主要介绍“怎么解决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平级的写法是错误的。
注意错误写法
根据搜索结果可以发现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失效的问题”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。