检索语法
更新时间:2024-05-08
检索方式
开启全文检索或者为字段配置索引之后,可以进行全文检索,或指定字段名称和字段内容进行检索。
检索语法关键字是 match,检索语句写在 match 关键字之后,和 match 关键字之间通过空格分隔。形如:
match 检索语句
支持的查询类型:
- 数值查询:指定字段和查询条件,所指定字段符合条件的日志会作为结果返回。例如
match status=200 and time_cost in [100 200)
表示查询 status 等于 200 且 time_cost 大于等于 100 且 time_cost 小于 200 的日志。 - 关键字查询:指定字段和关键字,所指定字段包含该关键字的日志会作为结果返回。如果不指定字段,将对日志原文进行查询。如果需要查询的关键字中包含检索语法运算符或空格,可以将关键字用双引号("")包裹,表示将双引号中的内容作为多个关键字查询。例如
match method:GET and msg:"service not avaliable"
表示查询 method 是 GET 并且 msg 包含关键字 service、not 和 avaliable 的日志,等价于查询match method:GET and msg:service and msg:"not" and msg:avaliable
。 - 短语查询:如果需要查询特定的关键字组合,可以将关键字用单引号('')包裹作为短语,表示按照单引号中的关键字顺序进行匹配查询。如果不指定字段,将对日志原文进行查询。例如
match msg:'service not avaliable'
表示查询 msg 包含短语 service not avaliable 的日志,且组成短语的关键字之前不包括其他关键字, service is temporarily not avaliable 和 not service avaliable 都不会命中查询。 -
模糊查询:在关键字中的中间或末尾加上模糊查询关键字,即 * 和 ?,日志服务会在所有日志中为您查询符合条件的日志。例如 match http_user_agent:andr* 表示在所有日志中查找 http_user_agent 字段包含以 andr 开头的词的日志。
限制说明:
- 查询时必须指定前缀,即 * 和 ? 不能出现在词的开头。
- 指定的词越精确,查询结果越精确。
字段对应的查询类型
- 对于 text 类型的字段,可以进行普通查询、短语查询、模糊查询。
- 对于 float 和 long 类型的字段,可以指定数值范围进行查询。
例如,查询语句为 match method:GET and status >= 500
,表示查询 method 字段值是 GET,且 status 字段值大于等于 500 的日志。
日志检索时报错原因分析
因为目前日志检索必须配置对应索引才可查询对应的柱形图和日志内容,否则会报错提示未配置索引
- 如match GET全文检索需要配置全文索引
- 如match method:GET字段检索需要配置对应的字段索引
- 如match * 查全部日志,目前需要配置全文索引或字段索引任意一种
运算符
运算符 | 说明 |
---|---|
and | 双目运算符。格式为 query1 and query2,表示 query1 和 query2 查询结果的交集。如果多个单词间没有语法关键词,默认是 and 的关系。 |
or | 双目运算符。格式为 query1 or query2,表示 query1 和 query2 查询结果的并集。 |
not | 双目运算符。格式为 query1 not query2,那么表示符合 query1 但不符合 query2 的结果,即 query1 - query2。如果省略 query1 ,只有 not query2 ,表示从全部日志中选取不包含 query2 的结果。 |
(,) | 括号用于把一个或多个子查询合并成一个查询条件,用于提高括号内查询条件的优先级。 |
: | 用于 key-value 对的查询。key:term 构成一个 key-value 对。表示在 key 的索引上执行 term 查询。如果 key 或者 value 内有空格( )、冒号(:)等保留字符,需要用双引号 "" 把整个 key 或者 value 包裹起来。左右引号内部的任何一个 term 都会被查询,而不会当成语法关键词。 |
* | 模糊查询关键字,用于替代 0 个或多个字符,例如:andr*,会返回 andr 开头的所有命中词。 |
? | 模糊查询关键字,用于替代一个字符,例如 andr?id,会返回以 andr 开头,以 id 结尾,并且中间还有一个字符的所有命中的词。 |
" | 转义符号,表示把一个关键词转换成普通的查询字符。左右引号内部的任何一个 term 都会被查询,而不会当成语法关键词。引号内的模糊查询关键字 (*,?) 会被当做字符常量处理。 |
' | 转义符号,表示关键字短语。左右引号内部的内容会被当做一个关键字短语进行短语查询。引号内的模糊查询关键字 (*,?) 会被当做字符常量处理。 |
\ | 转义符。用于转义引号,转义后的引号表示符号本身,不会当成转义字符,例如 "\""。 |
> | 查询某个字段下大于某个数值的日志,例如 status > 500。 |
>= | 查询某个字段下大于或等于某个数值的日志,例如 status >= 500。 |
< | 查询某个字段下小于某个数值的日志,例如 status < 400。 |
<= | 查询某个字段下小于或等于某个数值的日志,例如 status <= 400。 |
= | 查询某个字段下等于某个数值的日志,例如 status = 404。 |
in | 查询某个字段处于某个范围内的日志,使用中括号表示闭区间,使用小括号表示开区间,括号中间使用两个数字,数字中间为若干个空格。例如 status in [500 600] 或 status in [200 400)。 |
is null | 查询某个字段值为空或不包含该字段的日志。例如 error is null。 |
is not null | 查询某个字段值不为空的日志。例如 error is not null。 |
is true | 查询某个布尔类型的字段值为 true 的日志,例如 success is true。 |
is false | 查询某个布尔类型的字段值为 false 的日志,例如 success is false。 |
is not true | 查询某个布尔类型字段值不为 true 的日志。需要注意,若字段内容为空或日志中没有该字段,则默认字段值为null,满足字段值不为 true 的条件。例如 success is not true。如果需要查询有 success 字段,且值不为 true 的日志,可以使用 success is not null and success is not true 进行查询。 |
is not false | 查询某个布尔类型字段值不为 false 的日志。需要注意,若字段内容为空或日志中没有该字段,则默认字段值为null,满足字段值不为 false 的条件。例如 success is not false。 |
| | 管道运算符,用于分隔检索语法和 SQL 语法,表示在检索的基础上进行更多计算,例如 match query1 | select count(*)。 |