elk

Kibana的KQL查询语法指南 - 掌握Elasticsearch的查询技巧

silverwq
2023-05-07 / 0 评论 / 213 阅读 / 正在检测是否收录...

概述

Kibana 7.x 版本支持两种查询语法:

  1. KQL(Kibana Query Language)语法
  2. Lucene 语法

通用规则

引号

直接输入内容则会将内容进行分词,然后查询;若不想分词,整词查询,则两边加引号即可。

hello world 当作整体,不想被分词

"hello world"

模糊查询

基本规则有:

  1. ? 匹配单个字符
  2. * 匹配0到多个字符

例如下边这个可匹配:kibana

kiba?a

下边这个可匹配:elasticsearch

el*search

限定字段,下边这个可匹配title含有kibana的文档

title:kiba?a

模糊字段,下边这个可匹配title含有kibana的文档

tit*:kibana

容错查询

在一个单词后面加上~启用模糊搜索,可以搜到一些拼写错误的单词。

first~

能匹配到 frist

查询语法

全文搜索

直接输入查询内容即可。

例如:查找包含hello,或者包含world,或者两者都包含,直接输入就好。

# 会被分词成 hello 和 world 两个单词。只要有包含其中一个分词内容就会被搜索出来
hello world

需要注意的是,这个是分词搜索,如果是 hel 搜索的话,就会搜索不到,因为 hello 是一个分词

限定字段

字段名: 匹配值

例如:查询FlightNum字段匹配"4H2KUBH"字符串的文档。

FlightNum: 4H2KUBH

查询FlightNum字段存在(无论值是什么)的文档

FlightNum: *

范围查询

可以指定日期、数字或者字符串字段的范围。关系运算符只能用在数值和时间类型的字段,支持关系运算符如下:

  1. <= 小于等于
  2. >= 大于等于
  3. < 小于
  4. > 大于

例如,年龄大于等于30的

age >= 30

逻辑操作

支持逻辑运算符如下:

  1. and:与
  2. or:或
  3. not:非

and 使用

查询 name 字段包含 jane,且 addr 字段包含 beijing 的记录。

name:jane and addr:beijing

注意:查询结果不区分大小写

or 使用

查询 name 字段包含 jane,或者 addr 字段包含 beijing 的记录,或者两者都匹配。

name:jane or addr:beijing

not 的使用

查询出response字段中不包含200的记录

# 字段不等于某个值
not response:200
# 也可以不包含某个内容
level:ERROR AND (NOT msg:"Duplicate entry") AND (NOT "have concealed players") AND (NOT "cannot find service url") AND (NOT "502 Bad Gateway") AND (NOT "区服维护中,拒绝访问") AND (NOT "非法请求_!")

查询response包含200,并且整条记录不包含yes的数据记录

response:200 and not yes

查询response包含200,且response不包含yes的记录

response:(200 and not yes)

多个运算符结合

查询name包含jane且addr包含beijing的记录,或者job包含teacher的记录。

name:jane and addr:beijing or job:teacher

KQL中,and的优先级高于or。上方结果可以使用小括号来理解

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

值里使用运算符

查询response包含200,或者response包含404,或者包含200和404的记录。

response:(200 or 404)
# 或者
response:200 or response:400

注意:不保证顺序、不区分大小写。

嵌套查询

原始数据如下:

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

需求是:查找 level1.level2.prop1 是 foo 或者是 baz的

level1.level2 { prop1: "foo" or prop1: "baz" }
0

评论 (0)

取消