ElasticSearch查詢 第五篇:布爾查詢

ElasticSearch查詢 第一篇:搜索API

ElasticSearch查詢 第二篇:文檔更新

ElasticSearch查詢 第三篇:詞條查詢

ElasticSearch查詢 第四篇:匹配查詢(Match)

ElasticSearch查詢 第五篇:布爾查詢

布爾查詢是最常用的組合查詢,不僅將多個(gè)查詢條件組合在一起,并且將查詢的結(jié)果和結(jié)果的評(píng)分組合在一起。當(dāng)查詢條件是多個(gè)表達(dá)式的組合時(shí),布爾查詢非常有用,實(shí)際上,布爾查詢把多個(gè)子查詢組合(combine)成一個(gè)布爾表達(dá)式,所有子查詢之間的邏輯關(guān)系是與(and);只有當(dāng)一個(gè)文檔滿足布爾查詢中的所有子查詢條件時(shí),ElasticSearch引擎才認(rèn)為該文檔滿足查詢條件。布爾查詢支持的子查詢類(lèi)型共有四種,分別是:must,should,must_not和filter:

must子句:文檔必須匹配must查詢條件;

should子句:文檔應(yīng)該匹配should子句查詢的一個(gè)或多個(gè);

must_not子句:文檔不能匹配該查詢條件;

filter子句:過(guò)濾器,文檔必須匹配該過(guò)濾條件,跟must子句的唯一區(qū)別是,filter不影響查詢的score;

通常情況下,should子句是數(shù)組字段,包含多個(gè)should子查詢,默認(rèn)情況下,匹配的文檔必須滿足其中一個(gè)子查詢條件。如果查詢需要改變默認(rèn)匹配行為,查詢DSL必須顯式設(shè)置布爾查詢的參數(shù)minimum_should_match的值,該參數(shù)控制一個(gè)文檔必須匹配的should子查詢的數(shù)量,我遇到一個(gè)布爾查詢語(yǔ)句,其should子句中包含兩個(gè)查詢,如果不設(shè)置參數(shù)minimum_should_match,其默認(rèn)值是0。建議在布爾查詢中,顯示設(shè)置參數(shù)minimum_should_match的值。

注:布爾查詢的四個(gè)子句,都可以是數(shù)組字段,因此,支持嵌套邏輯操作的查詢。

例如,對(duì)于以下should查詢,一個(gè)文檔必須滿足should子句中兩個(gè)以上的詞條查詢:

"should" : [

? ? ? ? {? "term": {"tag":"azure" } },

? ? ? ? {? "term": {"tag":"elasticsearch" } },

? ? ? ? {? "term": {"tag":"cloud" } }

? ? ],"minimum_should_match":2

布爾查詢的各個(gè)子句之間的邏輯關(guān)系是與(and),這意味著,一個(gè)文檔只有同時(shí)滿足所有的查詢子句時(shí),該文檔才匹配查詢條件,作為結(jié)果返回。

在布爾查詢中,對(duì)查詢結(jié)果的過(guò)濾,建議使用過(guò)濾(filter)子句和must_not子句,這兩個(gè)子句屬于過(guò)濾上下文(Filter Context),經(jīng)常使用filter子句,使得ElasticSearch引擎自動(dòng)緩存數(shù)據(jù),當(dāng)再次搜索已經(jīng)被緩存的數(shù)據(jù)時(shí),能夠提高查詢性能;由于過(guò)濾上下文不影響查詢的評(píng)分,而評(píng)分計(jì)算讓搜索變得復(fù)雜,消耗更多CPU資源,因此,filter和must_not查詢減輕搜索的工作負(fù)載。

一,查詢和過(guò)濾上下文

在布爾查詢中,查詢被分為Query Context 和 Filter Context,查詢上下文由query參數(shù)指定,過(guò)濾上下文由filter和must_not參數(shù)指定。這兩個(gè)查詢上下文的唯一區(qū)別是:Filter Context不影響查詢的評(píng)分(score)。在布爾查詢中,F(xiàn)ilter參數(shù)和must_not參數(shù)使用Filter Context,而must和should使用Query Context,經(jīng)常使用Filter Context,引擎會(huì)自動(dòng)緩存數(shù)據(jù),提高查詢性能。

GET _search

{

? "query": {

? ? "bool": {

? ? ? "must": [

? ? ? ? { "match": {"title":"Search"? ? ? ? }},

? ? ? ? { "match": {"content":"Elasticsearch" }}?

? ? ? ],

? ? ? "filter": [

? ? ? ? { "term":? {"status":"published" }},

? ? ? ? { "range": {"publish_date": {"gte":"2015-01-01" }}}

? ? ? ]

? ? }

? }

}

對(duì)于上述查詢請(qǐng)求,must子句處于query context中,filter子句處于filter context中:

在query context中,must子句將返回同時(shí)滿足匹配(match)查詢的文檔;

在filter context中,filter子句是一個(gè)過(guò)濾器,將不滿足詞條查詢和范圍查詢條件的文檔過(guò)濾掉,并且不影響匹配文檔的score;

二,布爾查詢子句的邏輯關(guān)系

在布爾查詢中,各個(gè)子句之間的邏輯關(guān)系是與(and)。對(duì)于單個(gè)子句,只要一個(gè)文檔滿足該子句的查詢條件,返回的邏輯結(jié)果就是true,而對(duì)于should子句,它一般包含多個(gè)子查詢條件,參數(shù) minimum_should_match 控制文檔必須滿足should子句中的子查詢條件的數(shù)量,只有當(dāng)文檔滿足指定數(shù)量的should查詢條件時(shí),should子句返回的邏輯結(jié)果才是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子句中包含兩個(gè)詞條查詢,由于參數(shù) minimum_should_match的值是1,因此,只要一個(gè)穩(wěn)定滿足任意一個(gè)詞條查詢的條件,should子句就匹配成功,返回邏輯結(jié)果true,然后和其他子查詢進(jìn)行邏輯運(yùn)算,只有當(dāng)該文檔滿足所有的子查詢條件時(shí),才作為查詢結(jié)果返回到客戶端。

三,布爾查詢示例分析

1,使用布爾查詢實(shí)現(xiàn)簡(jiǎn)單的邏輯查詢

在下述示例中,分析布爾查詢的運(yùn)算邏輯:

must子句和should子句之間的邏輯關(guān)系是and;

must子句包含一個(gè)匹配查詢,字段eventname必須包含style詞條;

should子句是一個(gè)數(shù)組,包含兩個(gè)匹配查詢,文檔必須匹配的子句查詢條件數(shù)量由參數(shù) minimum_should_match控制;

參數(shù) minimum_should_match的值是1,這就意味著,一個(gè)文檔只要滿足任意一個(gè)查詢子句,就匹配should子句;

{?

? "query":{?

? ? ? "bool":{?

? ? ? ? "must":{?

? ? ? ? ? ? "match":{? "eventname":"style" }

? ? ? ? },

? ? ? ? "should":[?

? ? ? ? ? ? { "match":{ "eventname":"google" } },

? ? ? ? ? ? { "match":{? "eventname":"aws" }}

? ? ? ? ],

? ? ? ? "minimum_should_match":1? ? ? }

? }

}

通過(guò)上述分析,以下字段值滿足查詢條件:

"eventname": "Google style map"

"eventname": "AWS Game Day ~ Seattle Style!"

2,使用布爾查詢實(shí)現(xiàn)復(fù)雜的分組查詢

復(fù)雜的分組查詢,例如:(A and B) or (C and D) or (E and F) ,把布爾查詢作為should子句的一個(gè)子查詢:

{

? "_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? ? }

? }

}

出處:https://www.cnblogs.com/ljhdo/p/5040252.html?utm_source=gold_browser_extension

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容