Elasticsearch中布爾查詢(bool query)注意點

在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
    }
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赏胚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子崖疤,更是在濱河造成了極大的恐慌典勇,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件权烧,死亡現(xiàn)場離奇詭異伤溉,居然都是意外死亡,警方通過查閱死者的電腦和手機板祝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門扔字,熙熙樓的掌柜王于貴愁眉苦臉地迎上來温技,“玉大人,你說我怎么就攤上這事舵鳞。” “怎么了抛虏?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長慕淡。 經(jīng)常有香客問我沸毁,道長,這世上最難降的妖魔是什么携兵? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任搂誉,我火速辦了婚禮,結(jié)果婚禮上并级,老公的妹妹穿的比我還像新娘侮腹。我一直安慰自己,他們只是感情好凯旋,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布至非。 她就那樣靜靜地躺著,像睡著了一般谐鼎。 火紅的嫁衣襯著肌膚如雪趣惠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天草戈,我揣著相機與錄音侍瑟,去河邊找鬼丙猬。 笑死费韭,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的星持。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼羹令,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了损痰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤酒来,失蹤者是張志新(化名)和其女友劉穎卢未,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堰汉,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡辽社,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了翘鸭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滴铅。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖就乓,靈堂內(nèi)的尸體忽然破棺而出生蚁,到底是詐尸還是另有隱情噩翠,我是刑警寧澤邦投,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站志衣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏念脯。R本人自食惡果不足惜狞洋,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一绿店、第九天 我趴在偏房一處隱蔽的房頂上張望徘铝。 院中可真熱鬧,春花似錦、人聲如沸惕它。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽淹魄。三九已至郁惜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甲锡,已是汗流浹背兆蕉。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缤沦,地道東北人虎韵。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像缸废,于是被迫代替她去往敵國和親包蓝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容