elasticsearch should 和must 共存時 should失效問題
阿新 • • 發佈:2019-10-08
如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 }
參考