Elasticsearch 查詢詳解

實現對es中存儲的數據進行查詢分析,以_search爲結尾,查詢主要有兩種形式:

  • URI Search:操作簡便,方便通過命令行測試,僅包含部分查詢語法
  • Request Body Search:es提供完備查詢語法Query DSL(Domain Specific Language)

URI Search詳解


通過url query參數來實現搜索,常用參數如下:

  • q: 指定查詢語句,語法爲 Query String Syntax
  • df: q中不指定字段時默認查詢的字段,如果不指定,es會查詢所有字段
  • sort:排序
  • timeout:指定超時時間,默認不超時
  • from,size:用於分頁

案例如下所示:

GET /myindex/_search?q=alfred&df=user&sort=age:asc&from=4&size=10&timeout=1s
#查詢user字段包含alfred的文檔,結果按照age升序排列,返回第5-14個文檔,如果超過1s沒有結束,則以超時結束

Query String Syntax

  • 1.term與phrase
alfred way 等效於 alfred OR way
"alfred way" 詞語查詢,要求先後順序
  • 2.泛查詢
alfred等效於在所有字段去匹配該term
  • 3.指定字段name:alfred
  • 4.Group分組指定,使用括號指定匹配的規則
(quick OR brown) AND fox
status:(active OR pending) title:(full text search)
  • 5.布爾操作符
AND(&&),OR(||),NOT(!)
    name:(tom NOT lee) 注意大寫,不能小寫
+ - 分別對應must和must_not
    name:(tom +lee -alfred)
    name:((lee && !alfred)||(tom && lee && !alfred))

+ 在url中會被解析爲空格,要使用encode後的結果纔可以,爲%2B

  • 6.範圍查詢,支持數值和日誌

    • 區間寫法,閉區間用[],開區間用{}
    age: [1 TO 10]意爲 1<=age<=10
    age: [1 TO 10}意爲 1<=age<10
    age: [1 TO ]意爲 age>=1
    age: [* TO 10]意爲 age<=10
    • 算數符號寫法
      age:>=1
      age:(>=1&&<=10)或者age:(+>=1 +<=10)
  • 7.通配符查詢:?代表一個字符,*代表0或多個字符
name:t?m
name:tom*

通配符匹配執行效率低,且佔用較多內存,不建議使用
如無特殊需求,不要將?/*放在最前面
  • 8.正則表達式:name:/[mb]oat/
  • 9.模糊匹配 fuzzy query
name:roam~1
匹配與roam差一個character的詞,比如foam roams等
  • 10.近似度查詢 proximity search
"fox quick"~5
以term爲單位進行差異比較,比如"quick fox" "quick brown fox"都會被匹配

示例說明:

GET /myindex/_search?q=username:alfred way
{
  "profile": "true"
}

#其中alfred爲指定username字段查詢,way爲泛查詢


如果想在指定字段中查詢,可以改爲如下語句:
GET /myindex/_search?q=username:"alfred way"
GET /myindex/_search?q=username:(alfred way)

GET /myindex/_search?q=username:(alfred +way) (包含alfred或者包含way)+被解析爲空> > 格,需要改爲如下形式
GET /myindex/_search?q=username:(alfred %2Bway)(必須包含way,可以有alfred)


userna:alfred AND way 和userna:(alfred AND way)的查詢語法完全不同,前者包含一個泛查> 詢
可以通過{"profile": "true"}查看查詢語法。

Request Body Search


將查詢語句通過http request body 發送到es,主要包含如下參數:

  • query: 符合Query DSL語法的查詢語句
  • from,size
  • timeout
  • sort

Query DSL

Query DSL: 基於json定義的查詢語言,主要包含如下兩種類型:

  • 字段類查詢:如term、match、range等,只針對某一字段進行查詢
  • 複合查詢:如bool查詢等,包含一個或多個字段類查詢或者複合查詢語句

match查詢示例:

GET my_index/_search
{
  "query": {
    "match": {
      "username": "alfred way"
    }
  }
}

字段類型的查詢


  • 全文匹配:針對text類型字段進行全文檢索,對語句先進行分詞,如match,match_phrase

matchoperator參數,可選項爲and和or;minimum_should_match: 需要匹配的單詞數
match_phrase:詞語查詢
slop參數:控制單詞的間隔數(差異數)
query_string:類似於url中的q參數查詢
simple_query_string:會忽略錯誤的查詢語法,並且僅支持部分查詢語法,不能使用AND,OR,NOT,要用+,|,-代替

  • 單詞匹配:不會進行分詞處理,直接匹配倒排索引,如term,terms,range
    term;terms:一次傳入多個參數進行查詢
    range:gt,gte,lt,lte
    日期:gte:"1999-02-01" 計算:+1h -1d /d(將時間舍入到天)
    或者gte:"now-20y"(也可以用具體的日期"2018-01-01",使用的時候用||做隔離)
    2018-01||+1M/d

複合查詢


  • constant_score :將內部查詢結果的文檔得分設定爲1或者boost的值
    一般用於結合bool查詢實現自定義得分
  • bool :一個或者多個bool字句組成
  • filter,只過濾符合條件的文檔,不計算相關得分(對性能提升有用,做簡單查詢的時候,推薦使用filter替代query
  • must,文檔必須符合must中的條件,會影響相關性得分
  • must_not,文檔必須不符合must_not中的所有條件
  • should,文檔可以符合should中的條件,會影響得分,一般兩種形式:
    • (1)只包含should,不包含must:文檔必須滿足至少一個條件
      minimum_should_match:控制滿足的個數或者百分比
    • (2)同時包含shouldmust:不必滿足條件,如果滿足,會有加分
  • dis_max
  • function_score
  • boosting
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章