zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    匿名方法
    优化从 App.config 读取配置文件
    显示(explicit )与隐式(implicit)转换操作符
    ( 转 ) 聊一聊C#的Equals()和GetHashCode()方法
    协变和逆变
    html frameset的介绍
    html <frame>标签使用
    html <table>标签信息
    html 列表相关信息
    html <form>相关表单
  • 原文地址:https://www.cnblogs.com/-beyond/p/14159002.html
Copyright © 2011-2022 走看看