《ElasticSearch查詢》目錄導航:html
布爾查詢是最經常使用的組合查詢,不只將多個查詢條件組合在一塊兒,而且將查詢的結果和結果的評分組合在一塊兒。當查詢條件是多個表達式的組合時,布爾查詢很是有用,實際上,布爾查詢把多個子查詢組合(combine)成一個布爾表達式,全部子查詢之間的邏輯關係是與(and);只有當一個文檔知足布爾查詢中的全部子查詢條件時,ElasticSearch引擎才認爲該文檔知足查詢條件。布爾查詢支持的子查詢類型共有四種,分別是:must,should,must_not和filter:數組
一般狀況下,should子句是數組字段,包含多個should子查詢,默認狀況下,匹配的文檔必須知足其中一個子查詢條件。若是查詢須要改變默認匹配行爲,查詢DSL必須顯式設置布爾查詢的參數minimum_should_match的值,該參數控制一個文檔必須匹配的should子查詢的數量,我遇到一個布爾查詢語句,其should子句中包含兩個查詢,若是不設置參數minimum_should_match,其默認值是0。建議在布爾查詢中,顯示設置參數minimum_should_match的值。緩存
注:布爾查詢的四個子句,均可以是數組字段,所以,支持嵌套邏輯操做的查詢。elasticsearch
例如,對於如下should查詢,一個文檔必須知足should子句中兩個以上的詞條查詢:ide
"should" : [ { "term" : { "tag" : "azure" } }, { "term" : { "tag" : "elasticsearch" } }, { "term" : { "tag" : "cloud" } } ], "minimum_should_match" : 2
布爾查詢的各個子句之間的邏輯關係是與(and),這意味着,一個文檔只有同時知足全部的查詢子句時,該文檔才匹配查詢條件,做爲結果返回。性能
在布爾查詢中,對查詢結果的過濾,建議使用過濾(filter)子句和must_not子句,這兩個子句屬於過濾上下文(Filter Context),常常使用filter子句,使得ElasticSearch引擎自動緩存數據,當再次搜索已經被緩存的數據時,可以提升查詢性能;因爲過濾上下文不影響查詢的評分,而評分計算讓搜索變得複雜,消耗更多CPU資源,所以,filter和must_not查詢減輕搜索的工做負載。ui
一,查詢和過濾上下文google
在布爾查詢中,查詢被分爲Query Context 和 Filter Context,查詢上下文由query參數指定,過濾上下文由filter和must_not參數指定。這兩個查詢上下文的惟一區別是:Filter Context不影響查詢的評分(score)。在布爾查詢中,Filter參數和must_not參數使用Filter Context,而must和should使用Query Context,常常使用Filter Context,引擎會自動緩存數據,提升查詢性能。spa
GET _search { "query": { "bool": { "must": [ { "match": { "title": "Search" }}, { "match": { "content": "Elasticsearch" }} ], "filter": [ { "term": { "status": "published" }}, { "range": { "publish_date": { "gte": "2015-01-01" }}} ] } } }
對於上述查詢請求,must子句處於query context中,filter子句處於filter context中:code
二,布爾查詢子句的邏輯關係
在布爾查詢中,各個子句之間的邏輯關係是與(and)。對於單個子句,只要一個文檔知足該子句的查詢條件,返回的邏輯結果就是true,而對於should子句,它通常包含多個子查詢條件,參數 minimum_should_match 控制文檔必須知足should子句中的子查詢條件的數量,只有當文檔知足指定數量的should查詢條件時,should子句返回的邏輯結果纔是true。
{ "bool" : { "must" : { "term" : { "user" : "kimchy" } }, "filter": { "term" : { "tag" : "tech" } }, "must_not" : { "range" : { "age" : { "from" : 10, "to" : 20 } } }, "should" : [ { "term" : { "tag" : "wow" } }, { "term" : { "tag" : "elasticsearch" } } ], "minimum_should_match" : 1 } }
在上述布爾查詢中,should子句中包含兩個詞條查詢,因爲參數 minimum_should_match的值是1,所以,只要一個穩定知足任意一個詞條查詢的條件,should子句就匹配成功,返回邏輯結果true,而後和其餘子查詢進行邏輯運算,只有當該文檔知足全部的子查詢條件時,才做爲查詢結果返回到客戶端。
三,布爾查詢示例分析
1,使用布爾查詢實現簡單的邏輯查詢
在下述示例中,分析布爾查詢的運算邏輯:
{ "query":{ "bool":{ "must":{ "match":{ "eventname":"style" } }, "should":[ { "match":{ "eventname":"google" } }, { "match":{ "eventname":"aws" }} ], "minimum_should_match":1 } } }
經過上述分析,如下字段值知足查詢條件:
2,使用布爾查詢實現複雜的分組查詢
複雜的分組查詢,例如:(A and B) or (C and D) or (E and F) ,把布爾查詢做爲should子句的一個子查詢:
{ "_source": "topics", "from": 0, "size": 100, "query": { "bool": { "should": [ { "bool": { "must": [ { "term": { "topics": 1} }, { "term": { "topics": 2} } ] } }, { "bool": { "must": [ {"term": { "topics": 3 } }, {"term": { "topics": 4}} ] } } ], "minimum_should_match": 1 } } }
參考文檔:
Elasticsearch Reference [2.4] » Query DSL » Compound queries » Bool Query