Kibana查詢語言(KQL)


一.前言

  現在大多數的公司都會使用ELK組合來對日志數據的收集、存儲和提供查詢服務,這里就不介紹什么是ELK了,只介紹一些EKL中的查詢,也就是K(kibana)。

  查詢數據庫,如果是MySQL,那么就需要使用MySQL的語法;同樣的,在Kibana上查詢數據,也需要使用Kibana的語法,而Kibana的查詢語法叫做Kibana Query Language,簡稱KQL。

  本文的內容主要來自ES的官網,簡單翻譯了一下,https://www.elastic.co/guide/en/kibana/7.7/kuery-query.html

  原文鏈接:https://www.cnblogs.com/-beyond/p/14159002.html

 

二.KQL簡單介紹

  KQL(Kibana Query Language),也就是在Kibana上面進行查詢時使用的語法。

  Kibana中也可以使用Lucene的查詢語法,但是這里就不介紹了,可以參考https://www.elastic.co/guide/en/kibana/7.7/lucene-query.html

 

三.使用索引匹配查詢

  在Kibana中進行查詢的時候,建議使用指定索引查詢,這樣的效率更高,而不建議使用全局查找的方式。

  比如查找response為200的日志,那么就寫為response:200,這樣去查找中response值包含200這個的文檔對象;

  如果沒有指定response為200,那么只是單純的查找200,那么可能會返回金額為200的文檔對象(假設有金額字段),查詢的效率不高,同時也會返回一些不需要的數據; 

 

四.Kibana查詢語法

實例1

response:200

  上面這個表達式,會查詢出response字段中包含200的文檔對象,注意是包含,包含的是200這一個詞,比如下面幾種情況都會被查詢出來

200
hello world 200
hello 200 world

  需要注意的是1200或者2001,是不能被查出來的。

  如果要查詢1200或者2001,這種模糊匹配的,可以使用通配符,比如response:*200或者response:200*

 

實例2

message:"hello world yes"

  上面這個表達式,是針對message字段進行搜索,在搜索的時候不會區分大小寫,也就是說,Hello world YES也是會被搜索出來的;

  需要注意,上面的"hello world yes"使用了引號,這樣的話,這3個單詞會被作為一個詞進行查詢,不會再進行分詞,也就是說匹配的時候只會匹配hello world yes這樣的順序匹配,而不會匹配出helllo yes world;

 

實例3

message:hello world

  上面這個表達式,針對message字段進行搜索,搜索message中包含hello,或者包含world,或者兩者都包含的情況;

  需要注意的是,不區分大小寫,也不會保證順序,也就是說,下面幾種情況都會被匹配

hello
world
Hello
World
hello world
Hello world
hello yes World
yes world
world yes

  

實例4

name:jane or addr:beijing

  上面這個查詢條件,會查詢name字段包含jane,或者addr字段包含beijing的記錄,或者兩者都匹配;

  需要注意的是,or表示“或”,不區分大小寫;

 

實例5

name:jane and addr:beijing

  上面這個條件,會查詢name字段包含jane,且addr字段包含beijing的記錄。

 

實例6

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

 

實例7

name:jane and (addr:beijing or job:teacher)

  上面這個表達式,主要是想表明,可以使用括號來控制匹配的優先級。

 

實例8

response:(200 or 404)

  上面這個表達式,會查詢response包含200,或者response包含404,或者包含200和404的記錄(不保證順序、不區分大小寫);

  同時可以使用and來表示“且”的關系。

 

實例9

not response:200

  上面這個查詢條件,會查詢出response字段中不包含200的記錄。

 

實例10

response:200 and not yes

  上面這個查詢條件,會查詢response包含200,並且整條記錄不包含yes的數據記錄;

 

實例11

response:(200 and not yes)

  上面這個查詢條件,會查詢response包含200,且response不包含yes的記錄。

 

實例12

response:*

  上面這個查詢條件,會返回所有包含response字段的文檔對象。

 

實例13

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM