再使用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 }
参考