Elasticsearch查詢語句語法

weixin_34214500發表於2017-08-28

使用KIBANA查詢ES中的資料

在搜尋時,一定要選擇合理的時間範圍,這個時間範圍是基於建立索引模式時選擇的時間欄位。比如@timestamp

另外一個小提示:預設情況下,搜尋結果列表的上方會顯示一個柱狀圖。可以點選左下角的小箭頭,檢視其他的資訊,比如搜尋結果對應的ES請求主體等。

Elasticsearch查詢語句語法

查詢語句包含一系列詞語(term)和操作符。一個詞語可以是一個單詞,比如INFO
也可以是雙引號包圍的一個短語,比如"INFO make",這種情況下會搜尋這整個短語,按照單詞在短語中的順序。

指定欄位名稱

預設情況下,會在所有欄位中匹配要搜尋的詞語。或者我們也可以指定要搜尋的欄位。比如以下查詢:

  • 查詢message欄位中包含INFO單詞的記錄:message:INFO
  • 查詢message欄位中包含INFO make短語的記錄:message:"INFO make"
    在這個例子中,如果搜尋message:"make INFO"就會提示未找到結果,因為message欄位並不包含make INFO這個短語。(稍微注意搜尋欄的輸入內容和ES查詢請求中語句的差別)
  • 查詢message欄位中包含testinform的記錄:message:(test OR inform)
    如果省掉了OR,也就是message:(test inform),則使用設定的default_operator的值(其預設值為OR)。
  • 查詢所有mes開頭的欄位中包含trust的記錄:mes\*:trust*萬用字元前需要加反斜槓\
    這裡有一個問題,搜尋kafka.\*:trsutlog會報錯,因為這裡匹配的欄位的資料型別,有字串型別,數值型別,和未知型別。對於數值型別的欄位,我們只能使用數字來搜尋,使用字母等就會報錯。所以kafka.\*:17432195就有結果了。
    再比如,當我們嘗試查詢beat.\*:5.1.2時就成功了,因為匹配的beat.hostnamebeat.version欄位都是字串型別的。
  • 查詢message欄位值非空的記錄:_exists_:message

使用萬用字元

萬用字元搜尋適用於單個單詞中,使用替換單個字元,*替換零個或多個字元。比如:tags:trust* OR tes?的查詢結果如下。注意這個查詢中的tes?是用於匹配所有欄位的內容。如果要限定tags欄位,則應該查詢tags:(trust* OR tes?)
另外,使用萬用字元查詢是很佔用記憶體的。

正規表示式

比如查詢tags:/trust*/。具體正規表示式語法參考:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html#regexp-syntax

模糊操作符

可以搜尋相似的詞語,比如trsut~,同樣會匹配trust

取值範圍

範圍可以是日期,數值,或者字串欄位的範圍。閉區間:[min TO max];開區間:{min TO max};也可以結合在一起:[min TO max}

  • 日期:date:[2012-01-01 TO 2012-12-31]
  • 數值:count:[1 TO 5]
  • 字串:tag:{alpha TO omega}
  • 不指定最小值或最大值:
    • count:[10 TO *],也可以寫成count:>=10
    • date:{* TO 2012-12-31}: date在2012-12-31之前(這個我測試了,查不到預想的結果)

Boolean操作符

比如ERROR WARNING +INFO -DEBUG

  • WARNINGERROR可選,只是提高了相關性。
  • +INFO表示一定要包含INFO單詞。
  • -DEBUG表示一定不能包含DEBUG單詞。

如果使用ANDORNOT操作符(也寫作&&||!),則可以轉化成:

  • WARNING OR ERROR AND INFO AND NOT DEBUG
  • 不正確的轉化:(WARNING OR ERROR) AND INFO AND NOT DEBUG。這種情況下,必須至少匹配WARNINGERROR中一個。

保留字元

如果要匹配保留字元,則需要在字元前加反斜槓\。保留字元包括: + - = && || > < ! ( ) { } [ ] ^ " ~ * ? : \ /。比如:要搜尋(1+1)=2,則使用語句\(1\+1\)\=2
不過,<>是無法轉義的,它們總是會建立一個範圍查詢。

參考連結

ES文件:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#_ranges

星期六, 26. 八月 2017 05:58下午

相關文章