kibana的query string syntax 並不是 Query String Query,只能說類似。kibana的 Lucene query string syntax(es的query string syntax可以認為等同於Lucene的)類似於下面的語法
{
"query_string":{
"default_field":"name",
"query":"(this AND that) OR thu*"
}
}
但是,很明顯, 不能支持這么豐富的操作,沒這么強大。 因為kibana中的搜索,只能是單行, 只能把query_string 在一行內寫完,也就是合並了query_string內的field,query。
所以其語法還是非常類似的。
當然,要完全理解query_string,還是有些麻煩的。
AND OR 需要是大寫,小寫and or 是不行的! 否定是NOT,不是感嘆號(!)。過濾條件格式是:field:pattern,pattern遵循Lucene的query-string-syntax如果沒有空格,不需要引號,否則需要引號。pattern支持正則表達式;同時也支持 /ob[am]{2}a/ 這樣的正則表達式格式。—— 兩種正則表達式的區別呢?/reg/表達式,會去嘗試匹配一個單詞,從單詞的頭到尾。不允許多余的空格。兩種可以並行存在,如 msg:(/c+.*RE+.*g/ OR SELE*T)
/reg/是標准的正則表達式語法,其中的.表示任意字符,*表示數量一個或多個;而 msg:SELE*T 這種格式的正則表達式的* 同時表示了 字符和數量,相當於 .*
field 可以有多個,field之間使用AND或OR,也可以使用空格,空格表示的是使用default_operator(默認default_operator是OR);pattern也可以是一個復合的pattern(復合pattern用小括號包圍起來,然后使用AND OR或空格等關鍵字)
可以沒有field,那么會查詢 default_field ,
引號的含義是把引號內部的所有內容當作一個單詞!如 msg:"Switching JDBC Connection",引號內部的空格是隨意的(除了不能有換行符)內部的幾個單詞是有順序的(就是說不同順序就會不同結果), 引號內部是不支持正則表達式的,如 msg:"Switching JDBC Connectio*" 是查詢不到任何內容的。(也就是說,不會對引號內的內容進行任何解析,如同linux命令的echo 的雙引號參數)(why?此時,pattern的必須單詞,因為Lucene的最小單位是單詞,即最小向量是單詞?)如msg:"JDBC "是ok的,但 msg:"JDB" 是查詢不到任何內容的,因為引號內部的JDB不是一個完整的 已經被es索引好了的 向量。(我們的日志也沒有產生JDB這樣的單詞)
msg:JDB 也是無果,但是msg:JDB* 就是ok的!pattern沒有引號包圍,那么可以使用正則表達式,但是一般最好不要在前面使用,cuz:
Warning
Allowing a wildcard at the beginning of a word (eg "*ing") is particularly heavy, because all terms in the index need to be examined, just in case they match. Leading wildcards can be disabled by setting allow_leading_wildcard to false.
另外最好不要直接一個純*作為pattern,cuz:
Warning
Pure wildcards \* are rewritten to exists queries for efficiency.As a consequence, ...
示例:
app_name:project_app AND level:ERROR AND full_message:"Unknown column "
level:ERROR 可以寫成 level:ERROr, level:erRor, 但是 level:ERRO 就不行。當然這也得看level是什么數據類型,是否允許變形。這些都是可以在es中設置的。
參考:
https://www.elastic.co/guide/en/elasticsearch/reference/6.0/query-dsl-query-string-query.html#query-string-syntax
https://www.imooc.com/article/38062