查询字符串语法是SLS DSL中用于快速过滤数据的语法,可以简化条件判断。本文介绍查询字符串的通用语法规则。
函数列表
使用以下函数时,您可以使用查询字符串语法。
类型 | 函数 | 场景 |
事件检查函数 | 使用查询字符串判断事件的字段值是否满足特定条件。 | |
资源函数 | 从Logstore中获取并返回表格结构的数据,支持使用查询字符串配置黑白名单进行过滤筛选。 | |
从RDS MySQL中获取并返回表格结构的数据,支持使用查询字符串配置黑白名单进行过滤筛选。 |
功能概览
不同搜索功能对字段搜索和全文搜索的支持情况如下表所示。
功能 | 字段搜索 | 全文搜索 |
子串搜索 | 支持 | 支持 |
通配符 | 支持 | 支持 |
完全匹配搜索 | 支持 | 不支持 |
正则表达式搜索 | 支持 | 不支持 |
数值范围搜索 | 支持 | 不支持 |
数值比较 | 支持 | 不支持 |
关系and、or、not及组合 | 支持 | 支持 |
字符转义
在字符串查询语法中,需要对一些特殊字符,例如星号(*)、反斜线(\)等进行转义操作。
字段名转义
字段名不能使用半角双引号("")包裹,包含特殊字符时使用反斜线(\)转义。例如:
\*\(1+1\)\?: abc
:使用反斜线(\)转义。__tag__\:__container_name__: abc
:使用反斜线(\)转义。中文字段: abc
:中文不需要转义。"content": abc
:非法定义,字段名不能用半角双引号("")包裹。
搜索值转义
包含半角双引号("")或反斜线(\)时需用反斜线(\)转义,例如
content: "abc\"xy\\z"
。说明搜索值只能使用半角双引号("")包裹。您可以使用单引号('')包裹外层字符串,使用半角双引号("")包裹里层搜索值,例如:
e_search("domain: '/url/test.jsp'")
是错误的,正确的为e_search('domain: "/url/test.jsp"')
。搜索星号(*)或半角问号(?)时需要使用反斜线(\)转义,否则会被视为通配符匹配。
只包含中文、字母、数字、下划线(_)、短划线(-)、星号(*)或半角问号(?)这些特殊字符时,不需要用半角双引号("")包裹,其他情况需要使用半角双引号("")包裹。例如:
status: "\*\?()[]:="
:使用半角双引号("")包裹,并使用反斜线(\)对星号(*)、半角问号(?)进行转义,其他字符不用转义。content: ()[]:=
:非法定义,需要使用半角双引号("")包裹。status: active\*test
、status: active\?test
:字段值仅包含星号(*)、半角问号(?)及字母,只需要对星号(*)或半角问号(?)进行转义,不需要使用半角双引号("")包裹。
子串搜索
全文搜索
在所有字段中搜索子串。
语法格式
e_search('子串')
示例
e_search('"错误"')
:搜索中文子串。e_search('"active error"')
:搜索完整带空格的子串。e_search('active error')
:多个子串搜索,多个子串之间默认为OR关系。
字段搜索
在特定字段中搜索子串。
语法格式
e_search('...')
示例
e_search('status: active')
:子串搜索。e_search('author: "john smith"')
:带空格子串搜索。
说明e_search('field: active error')
相当于field:active OR "error"
,表示在field字段中搜索active或者全文搜索error。
通配符搜索
星号(*)表示零个或多个字符串,半角问号(?)表示一个字符,也可以表示一个宽字符(例如中文字符)。
全文搜索
在所有字段中搜索子串。
语法格式
e_search('子串')
示例
e_search('active*test')
:匹配零到多个字符,因为字符串中有星号(*),所以该字符串不需要使用半角双引号("")包裹。e_search('发生*错误')
:匹配零到多个字符,可以匹配发生错误
,发生严重错误
等。e_search('active?good')
:匹配一个字符,因为字符串中有半角问号(?),所以该字符串不需要使用半角双引号("")包裹。e_search('ac*tive?good')
:完全匹配。e_search('ac*tive??go*od')
:支持多个混合使用。
字段搜索
在特定字段中搜索子串。
语法格式
e_search('字段名:子串')
示例
e_search('status: active*test')
:匹配零到多个字符。e_search('status: active?good')
:匹配一个字符。
完全匹配
完全匹配要求对字段值从开始到结尾完全匹配。
语法格式
e_search('字段名==完全匹配字符串')
示例
e_search('author== "john smith"')
:author字段完全等于john smith。e_search('status== ac*tive?good')
:与通配符结合使用。
正则表达式匹配
正则表达式匹配是比通配符匹配更强大的匹配方式。
语法格式
e_search('字段名~=正则表达式字符串')
说明由于正则表达式中可能包含反斜线(\),推荐使用
r
进行不转义。默认为部分匹配,如果需要完全匹配,需要在开头和结尾加上
^
和$
。
示例
e_search('status~= "\d+"')
:status字段包含数字。e_search('status~= "^\d+$"')
:status字段等于数字。
数值比较
对数值进行比较。
数值直接比较
使用
>
、>=
、=
、<
、<=
进行比较。e_search('age >= 18') # >=18 e_search('age > 18') # > 18 e_search('age = 18') # = 18 e_search('age <= 18') # <=18 e_search('age < 18') # < 18
数值范围比较:
使用闭区间,支持使用星号(*)表示无边界。
e_search('count: [100, 200]') # >=100 and <=200 e_search('count: [*, 200]') # <=200 e_search('count: [200, *]') # >=200
逻辑关系
支持任意搜索之间的逻辑关系,也支持用圆括号()
进行嵌套。
逻辑关系 | 关键字 |
且 |
|
或 |
|
否 |
|
样例:
e_search('abc OR xyz') # 关系运算符不区分大小写
e_search('abc and (xyz or zzz)')
e_search('abc and not (xyz and not zzz)')
e_search('abc && xyz') # and
e_search('abc || xyz') # or
e_search('abc || !xyz') # or not
子串匹配也支持逻辑关系:
e_search('field: (abc OR xyz)') # 字段field包含abc或xyz
e_search('field: (abc OR not xyz)') # 字段field包含abc或不包含xyz
e_search('field: (abc && !xyz)') # 字段field包含abc且不包含xyz
字段判断
使用搜索字符串对字段进行判断。
e_search('field: *')
:字段存在。e_search('not field:*')
:字段不存在。e_search('not field:""')
:字段不存在。e_search('field: "?"')
:字段存在且值不为空。e_search('field==""')
:字段存在且值为空。e_search('field~=".+"')
:字段存在且值不为空。e_search('not field~=".+"')
:字段不存在或值为空。e_search('not field==""')
:字段不存在或值不为空。