在ES中驻粟,bool查詢存在著一些比較坑的點需要注意:
基礎知識點
布爾查詢是最常用的組合查詢,根據(jù)子查詢的規(guī)則挤巡,只有當文檔滿足所有子查詢條件時(即bool查詢中的所有子查詢的最后需要作and)酷麦,elasticsearch引擎才將結(jié)果返回。布爾查詢支持的子查詢條件共4種:
- must(and)返回的文檔必須滿足must中所有子句的條件,并且參與計算分值
# 查詢文檔中desc精確匹配“中國人”母廷,
# 而且desc必須能夠到
# 匹配“哈哈嘻嘻呼呼方面中國傳統(tǒng)”的文檔糊肤。
# (match會對關鍵詞進行分詞,有滿足的即返回)
GET /dangdang/books/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"desc": {
"value": "中國人"
}
}
},
{
"match": {
"desc": "哈哈嘻嘻呼呼方面中國傳統(tǒng)"
}
}
]
}
}
}
- should(or)返回的文檔可能滿足should子句的條件馆揉,在一個bool查詢中,如果沒有must或者filter把介,當should有一個或多個條件時,默認那么只要滿足一個就可以返回拗踢。
# 查詢文檔中desc包含了“中國人”
# 或者包含了“引用”的文檔
GET /dangdang/books/_search
{
"query": {
"bool": {
"should": [
{
"term": {
"desc": {
"value": "中國人"
}
}
},
{
"term": {
"desc": {
"value": "引用"
}
}
}
],
# 不寫的話默認為1(即shoule的所有條件中巢墅,
# 只要有1個條件滿足,那么即判定該文檔匹配)
# =2的話即代表所有條件中
# 必須有>=2個條件滿足才判斷匹配成功
"minimum_should_match": 1
}
}
}
- must_not(not)返回的文檔必須不滿足定義的所有條件
# 查詢文檔中desc沒有“美國”且沒有“修養(yǎng)”的記錄
GET /dangdang/books/_search
{
"query": {
"bool": {
"must_not": [
{
"term": {
"desc": {
"value": "美國"
}
}
},
{
"term": {
"desc": {
"value": "修養(yǎng)"
}
}
}
]
}
}
}
- filter 返回的文檔必須滿足filter子句的條件,但是不參與計算分值
# 查找文檔中desc包含“人”的記錄
GET /dangdang/books/_search
{
"query": {
"bool": {
"filter": {
"term": {
"desc": "人"
}
}
}
}
}
組合查詢
非常需要注意的點:
在組合查詢中驯遇,即由must蓄髓、must not、filter陡叠、should組合而成的bool查詢,有一個很重要的點時枉阵,當使用should查詢時,且除了should查詢之外還有must侦厚、filter中的任意一個時(也可以must拙徽、filter同時都有),should的條件默認會被自動忽略(即minimum_should_match此時被設置成0)已卷。
舉個簡單的例子淳蔼,現(xiàn)要查詢文檔中a=1,b=2讳癌,(c=8或c=9)的記錄存皂,此時可能會這么寫:
GET /dangdang/books/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"a": {
"value": "1"
}
}
},
{
"term": {
"b": {
"value": "2"
}
}
}
],
"should": [
{
"term": {
"c": {
"value": "8"
}
}
},
{
"term": {
"c": {
"value": "9"
}
}
}
]
}
}
}
但是結(jié)果會跟實際預期的不一樣,當有should又有must/filter時骤菠,如果一條記錄滿足a=1疤孕,b=2,但即使c=999鹉戚,該記錄依然會被匹配成功专控,即should的條件會被視為無效,相當于minimum_should_match=0赢底。如果想要達到預期的效果,可以將minimum_should_match設置為1幸冻,此時是滿足該需求的。
GET /dangdang/books/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"a": {
"value": "1"
}
}
},
{
"term": {
"b": {
"value": "2"
}
}
}
],
"should": [
{
"term": {
"c": {
"value": "8"
}
}
},
{
"term": {
"c": {
"value": "9"
}
}
}
],
# 滿足should所有條件中的一個
"minimum_should_match": 1
}
}
}
嵌套bool查詢
# 篩選出desc包含“人”且包含“鬼”的記錄,
# 且記錄中至少包含了“蔡元培”趁啸,“中國人”督惰,
# “引用” 條件中至少2個條件的記錄
GET /dangdang/books/_search
{
"query": {
"bool": {
"filter": {
"bool": {
"must": [
{
"term": {
"desc": {
"value": "人"
}
}
},
{
"term": {
"desc": {
"value": "鬼"
}
}
}
]
}
},
"should": [
{
"term": {
"desc": {
"value": "引用"
}
}
},
{
"term": {
"desc": {
"value": "中國人"
}
}
},
{
"term": {
"desc": {
"value": "蔡元培"
}
}
}
],
"minimum_should_match": 2
}
}
}