Kibana Query Language - KQL


導語



Kibana Query Language (KQL) 是一種使用自由文本搜索或基於字段的搜索過濾 Elasticsearch 數據的簡單語法。KQL 僅用於過濾數據,並沒有對數據進行排序或聚合的作用。


KQL 能夠在你鍵入時建議字段名稱、值和運算符。建議的性能由 Kibana 設置控制:


在上面的搜索框的右邊,我們可以看到 KQL 字樣。它表明當前的模式是 KQL 查詢。


KQL 具有與 Lucene 查詢語法不同的一組功能。KQL 能夠查詢嵌套字段和腳本字段。KQL 不支持正則表達式或模糊術語搜索。要使用傳統的 Lucene 語法,請單擊搜索框右邊的 KQL,然後關閉 KQL。


有關 KQL 的一些介紹,在我的另外一篇文章 “Kibana: 如何使用 Search Bar” 中有所介紹。


準備數據


在今天的練習中,我將使用 Kibana 自帶的索引來做展示:


這樣我們就在 Elasticsearch 中創建了一個叫做 kibana_sample_data_logs 的索引。


Terms query


術語查詢使用精確的搜索術語。空格分隔每個搜索詞,並且只需要一個詞來匹配文檔。使用引號表示短語匹配(phrase match)。


要使用精確搜索詞進行查詢,請輸入字段名稱,後跟 :,然後輸入以空格分隔的值:


如上所示。在 response 中只要匹配其中的任何一個 200,400,或者 503,那麼搜索的答案都會顯示出來。


對於文本字段,無論順序如何,這都將匹配任何值:


要查詢確切的短語(phrase),請在值周圍使用引號:


KQL 不需要字段名稱。如果未提供字段名稱,則索引設置中的默認字段將匹配術語。要跨字段搜索:


Boolean queries


KQL 支持 or、and 和 not。默認情況下,and 的優先級高於 or。要覆蓋默認優先級,請在括號中將運算符分組。這些運算符可以是大寫或小寫。


要匹配 response 爲 200、或者地理位置目的地(geo.dest)爲 CN. 或兩者都滿足的文檔:

response: 200 or geo.dest: "CN"


要匹配 response 爲 200 且 geo.dest 爲 CN 的文檔:

response: 200 and geo.dest: "CN"


從上面,我們可以看出來,查詢的結果爲290,明顯比上次的查詢結果少。


匹配 response 爲 200 或 404 的文檔:

response:(200 or 404)


要匹配 response 爲 200 且 extension 爲 php 或 css 的文檔: 

response:200 and (extension:php or extension:css)


要匹配 response 爲 200 且 extension 爲 php 或 extension 爲 css 且 response 爲任何內容的文檔。還記得我們之前說過的 and 的優先級比 or 要高:

response:200 and extension:php or extension:css


你可以理解上面的查詢是這樣的:

(response:200 and extension:php) or extension:css


匹配 response 不是 200 的文檔:

not response:200


匹配 response 爲 200 但 extension 不是 php 或 css 的文檔:

response:200 and not (extension:php or extension:css)


要匹配包含術語列表的多值字段:

tags:(success and info and security)


Range queries


KQL 支持數字和日期類型的 >、>=、< 和 <=。

bytes > 1000 and (hour_of_day>10 and hour_of_day <14  )


Date range queries


通常,Kibana 的時間過濾器足以設置時間範圍,但在某些情況下,你可能需要搜索日期。在引號中包含日期範圍。


Exits queries


Exist 查詢匹配包含任何字段值的文檔,在本例中爲響應:

response:*


存在由 Elasticsearch 定義,包括所有值,包括空文本。 


Wildcard queries


通配符查詢可用於按術語前綴搜索或搜索多個字段。Kibana 的默認設置出於性能原因禁止使用前導通配符,但可以通過高級設置允許。


要匹配 machine.os 以 win 開頭的文檔,例如 “windows 7” 和 “windows 10”:

machine.os:win*


 匹配多個字段:

machine.os*: win* 10


 當你有字段的 text 和 keyword 版本時,此語法很方便。該查詢檢查 machine.os 和 machine.os.keyword 中的術語 win 10。


Nested field queries


查詢嵌套字段的一個主要考慮因素是如何將嵌套查詢的部分匹配到單個嵌套文檔。你可以:

  • 僅將查詢的部分匹配到單個嵌套文檔。這是大多數用戶在查詢嵌套字段時想要的。

  • 將查詢的部分匹配到不同的嵌套文檔。這就是常規對象字段的工作方式。此查詢通常不如匹配單個文檔有用。


在以下文檔中,items 是一個嵌套字段。嵌套字段中的每個文檔都包含 name、stock 和 category。

{  "grocery_name": "Elastic Eats",  "items": [    {      "name": "banana",      "stock": "12",      "category": "fruit"    },    {      "name": "peach",      "stock": "10",      "category": "fruit"    },    {      "name": "carrot",      "stock": "9",      "category": "vegetable"    },    {      "name": "broccoli",      "stock": "5",      "category": "vegetable"    }  ]}


我們創建一個如下的 test 索引:

PUT test{  "mappings": {    "properties": {      "grocery_name": {        "type": "text"      },      "items": {        "type": "nested",        "properties": {          "category": {            "type": "text"          },          "name": {            "type": "text"          },          "stock": {            "type": "integer"          }        }      }    }  }}


我們創建如下的一個文檔:

PUT test/_doc/1{  "grocery_name": "Elastic Eats",  "items": [    {      "name": "banana",      "stock": "12",      "category": "fruit"    },    {      "name": "peach",      "stock": "10",      "category": "fruit"    },    {      "name": "carrot",      "stock": "9",      "category": "vegetable"    },    {      "name": "broccoli",      "stock": "5",      "category": "vegetable"    }  ]}


我們爲 test 索引創建一個叫做 test* 的索引模式。


匹配單個文檔


要匹配庫存超過 10 個香蕉的商店:

items:{ name:banana and stock > 10 }


items 是 nested path。花括號(嵌套組)內的所有內容都必須匹配單個嵌套文檔。


 以下查詢不返回任何匹配項,因爲沒有單個嵌套文檔具有庫存爲 9 的香蕉。

items:{ name:banana and stock:9 }


匹配不同的文檔


以下子查詢位於單獨的嵌套組中,可以匹配不同的嵌套文檔:

items:{ name:banana } and items:{ stock:9 }


name:banana 匹配數組中的第一個文檔,而 stock:9 匹配數組中的第三個文檔。


匹配單個和不同的文檔


要找到一家擁有 10 多個香蕉且同時備有蔬菜的商店:

items:{ name:banana and stock > 10 } and items:{ category:vegetable }


 第一個嵌套組(name:banana and stock > 10)必須匹配單個文檔,但是 category:vegetables 子查詢可以匹配不同的嵌套文檔,因爲它在一個單獨的組中。


其他嵌套字段內的嵌套字段


KQL 支持其他嵌套字段中的嵌套字段——你必須指定完整路徑。在本文檔中,level1 和 level2 是嵌套字段:

{  "level1": [    {      "level2": [        {          "prop1": "foo",          "prop2": "bar"        },        {          "prop1": "baz",          "prop2": "qux"        }      ]    }  ]}


要匹配單個嵌套文檔:

level1.level2:{ prop1:foo and prop2:bar }


參考:

【1】

https://www.elastic.co/guide/en/kibana/current/kuery-query.html


正文完



 作者:劉曉國

本文編輯:喝咖啡的貓



嗨,互動起來吧!

喜歡這篇文章麼?

歡迎留下你想說的,留言 100% 精選哦!

Elastic 社區公衆號長期徵稿,如果您有 Elastic  技術的相關文章,也歡迎投稿至本公衆號,一起進步! 投稿請添加微信:medcl123



招聘信息

Job board


社區招聘欄目是一個新的嘗試,幫助社區的小夥伴找到心儀的職位,也幫助企業找到所需的人才,爲伯樂和千里馬牽線搭橋。有招聘需求的企業和正在求職的社區小夥伴,可以聯繫微信 medcl123 提交招聘需求和發佈個人簡歷信息。


Elastic中文社區公衆號 (elastic-cn)

爲您彙集 Elastic 社區的最新動態、精選乾貨文章、精華討論、文檔資料、翻譯與版本發佈等。

喜歡本篇內容就請給我們點個[在看]吧




本文分享自微信公衆號 - Elastic中文社區(elastic-cn)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章