这篇文章主要介绍“怎么解决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失效的问题”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/4054187/blog/3114098