如今大多數的公司都會使用ELK組合來對日誌數據的收集、存儲和提供查詢服務,這裏就不介紹什麼是ELK了,只介紹一些EKL中的查詢,也就是K(kibana)。html
查詢數據庫,若是是MySQL,那麼就須要使用MySQL的語法;一樣的,在Kibana上查詢數據,也須要使用Kibana的語法,而Kibana的查詢語法叫作Kibana Query Language,簡稱KQL。java
本文的內容主要來自ES的官網,簡單翻譯了一下,https://www.elastic.co/guide/en/kibana/7.7/kuery-query.html數據庫
原文連接:https://www.cnblogs.com/-beyond/p/14159002.htmlide
KQL(Kibana Query Language),也就是在Kibana上面進行查詢時使用的語法。ui
Kibana中也可使用Lucene的查詢語法,可是這裏就不介紹了,能夠參考https://www.elastic.co/guide/en/kibana/7.7/lucene-query.html翻譯
在Kibana中進行查詢的時候,建議使用指定索引查詢,這樣的效率更高,而不建議使用全局查找的方式。日誌
好比查找response爲200的日誌,那麼就寫爲response:200,這樣去查找中response值爲200的文檔對象;htm
若是沒有指定response爲200,那麼只是單純的查找200,那麼可能會返回金額爲200的文檔對象(假設有金額字段),查詢的效率不高,同時也會返回一些不須要的數據; 對象
response:200
上面這個表達式,會查詢出response字段中包含200的文檔對象,注意是包含,包含的是200這一個詞,好比下面幾種狀況都會被查詢出來blog
200 hello world 200 hello 200 world
須要注意的是1200或者2001,是不能被查出來的。
message:"hello world yes"
上面這個表達式,是針對message字段進行搜索,在搜索的時候不會區分大小寫,也就是說,Hello world YES也是會被搜索出來的;
須要注意,上面的"hello world yes"使用了引號,這樣的話,這3個單詞會被做爲一個詞進行查詢,不會再進行分詞,也就是說匹配的時候只會匹配hello world yes這樣的順序匹配,而不會匹配出helllo yes world;
message:hello world
上面這個表達式,針對message字段進行搜索,搜索message中包含hello,或者包含world,或者二者都包含的狀況;
須要注意的是,不區分大小寫,也不會保證順序,也就是說,下面幾種狀況都會被匹配
hello world Hello World hello world Hello world hello yes World yes world world yes
name:jane or addr:beijing
上面這個查詢條件,會查詢name字段包含jane,或者addr字段包含beijing的記錄,或者二者都匹配;
須要注意的是,or表示「或」,不區分大小寫;
name:jane and addr:beijing
上面這個條件,會查詢name字段包含jane,且addr字段包含beijing的記錄。
name:jane and addr:beijing or job:teacher
上面這個查詢條件中,出現了and和or,須要記住的是,KQL中,and的優先級高於or;
因此上面的查詢條件,會查詢name包含jane,且addr包含beijing的記錄,或者job包含teacher的記錄,可使用括號來讓上面的查詢條件更好理解:
(name:jane and addr:beijing) or job:teacher
name:jane and (addr:beijing or job:teacher)
上面這個表達式,主要是想代表,可使用括號來控制匹配的優先級。
response:(200 or 404)
上面這個表達式,會查詢response包含200,或者response包含404,或者包含200和404的記錄(不保證順序、不區分大小寫);
同時可使用and來表示「且」的關係。
not response:200
上面這個查詢條件,會查詢出response字段中不包含200的記錄。
response:200 and not yes
上面這個查詢條件,會查詢response包含200,而且整條記錄不包含yes的數據記錄;
response:(200 and not yes)
上面這個查詢條件,會查詢response包含200,且response不包含yes的記錄。
response:*
上面這個查詢條件,會返回全部包含response字段的文檔對象。
machine*:hello
上面這個查詢條件,會查詢machine1字段,machine2字段...machinexyzabc字段包含hello的數據記錄,這裏只是想表達,對於搜索的字段列,也是可使用通配符的。
KQL仍是比較簡單地,主要記住KQL匹配時是不區分大小寫的,可使用括號改變匹配優先級;
另一個要點就是,匹配是「包含」,某個字段「包含」某個詞,而不是某個字段的值爲某個詞。
原文連接:https://www.cnblogs.com/-beyond/p/14159002.html
參考文獻:
https://www.elastic.co/guide/en/kibana/7.7/search.html
https://www.elastic.co/guide/en/kibana/7.7/kuery-query.html