ES 2.x查詢

最近在搞ES版本升級,從2.x升級到7.x。總結下2.x的查詢一遍後續重構代碼。

結構化查詢

  • 精確查詢 term: 查詢只對倒排索引的詞項精確匹配。切記term是包含而不是相等的意思
  • 精確查詢多個 terms:後跟數組參數。可以看作是多個term組合查詢。
  • 組合過濾查詢 bool:bool可嵌套,構造複雜的filter過濾器。過濾器做二元判斷,文檔是否應該出現在結果中。
{
   "bool" : {
      "must" :     [],  ==and
      "should" :   [], == or
      "must_not" : [], == not
   }
}
  • 範圍查詢 range:可作用於數字,日期,字符串。
gt: > 大於(greater than)
lt: < 小於(less than)
gte: >= 大於或等於(greater than or equal to)
lte: <= 小於或等於(less than or equal to)
  • 處理 Null:null, [] (空數組)和 [null] 所有這些都是等價的,它們無法存於倒排索引中。
1.存在查詢exists 類似 is not null
2.缺失查詢missing 類似 is null

全文搜索

string:keyword(不分詞),text(分詞)

1.匹配查詢:match的步驟

1.檢查字段類型,看查詢本身是否需要analyze
2.使用分析器分析查詢字符串,分析出幾個詞典,就有幾次term查詢
3.底層使用term查詢在倒排索引中查詢匹配的文檔
4.爲查詢得到的文檔評分,分數越高排序約靠前

2.多詞查詢:match支持多詞查詢。

底層會使用bool查詢執行多次term查詢。可以認爲match多次查詢是生成多個term 查詢包裹 在一個 bool 查詢中。

1 提高精度,match接受operator操作符,operator值默認爲or,可以使用and提高匹配的精度
2 控制精度,operator操作符非黑即白,結果不是我們想要的。
match接受minnum_should_match最小匹配參數,可以設置一個百分比參數或者具體數字。

3.bool查詢:跟bool過濾器接受相同的參數

{
   "bool" : {
      "must" :     [], == and
      "should" :   [], == or
      "must_not" : [], == not
   }
}
1 過濾器做二元判斷:文檔是否應該出現在結果中?但查詢更精妙,它除了決定一個文檔是否應該被包括在結果中,還會計算文檔的 相關程度。
2 評分計算,bool查詢會爲查詢到的每一個文檔計算得分,把must和should的得分求和,然後除於must和should語句的條數。
3 控制精度,當沒有must匹配時,必須有一個should匹配,可以用minnum_should_match小匹配參數控制should的匹配數目。

4.提高權重:通過boost來控制任何查詢語句的相對的權重

boost 的默認值爲 1 ,大於 1 會提升一個語句的相對權重。小於1(0到1之間)則降低語句的相對權重

5.控制分析:分析器可以從三個層面進行定義:按字段(per-field)、按索引(per-index)或全局缺省(global default)。

1 一般需要保證文檔在索引時與查詢字符串在搜索時應用相同的分析過程非常重要,這樣查詢的項才能夠匹配倒排索引中的項
2 索引時分析器的選擇順序:字段映射裏定義的 analyzer -> 索引設置中名爲 default 的分析器 ->standard 標準分析器
3 搜索時分析器的選擇順序:查詢自己定義的 analyzer -> 字段映射裏定義的 analyzer -> 索引設置中名爲 default 的分析器 -> standard 標準分析器
4 當索引文檔和搜索文檔時analyze不同時,提供search_analyzer 僅會應用於搜索時。還有一個等價的 default_search 映射,用以指定索引層的默認配置
		搜分析器的選擇順序會改變:查詢自己定義的 analyzer -> 字段映射裏定義的 search_analyzer ->字段映射裏定義的 analyzer -> 索引設置中名爲 default_search 的分析器 -> 索引設置中名爲 default 的分析器 -> standard 標準分析器
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章