日志服务数据加工: 查询字符串语法

日志服务数据加工: 查询字符串语法

概述

搜索字符串是ETL语言中用于快速过滤的语法, 语法基本上与日志服务的查询语法, 以及lucene 语法相同. 可以极大简化数据加工的条件判断的逻辑.

相关函数

如下函数会使用到查询字符串语法.

类型 函数 使用场景
表达式函数-事件判断函数 e_search 使用查询字符串判断事件的字段值是否满足特定条件, 返回True或False
表达式函数-资源函数 res_log_logstore_pull 拉取Logstore资源返回表格, 构建表格中, 使用查询字符串配置黑白名单, 来判断每行是保留还是丢弃.
全局事件函数-搜索表格映射 e_search_table_map 关键字是查询字符串, 值是匹配的值的字典进行映射

功能概览

功能 字段 全文
子串搜索 支持 支持
通配符*?搜索 支持 支持
完全匹配搜索 支持 -
正则表达式搜索 支持 -
数值范围搜索 支持 -
数值比较 支持 -
关系and, or, not以及*组合 支持 支持

搜索值转义

  1. 包含", \时需要用\转义.
    例如:

content: "abc\"xy\\z" 合法

  1. 希望搜索*, ?时, 也需要用\转义, 否则会被视为通配符匹配
  2. 包含中文, 字母, 数字, 下划线, 小横线, *, ?等情况不需要用双引号, 其他情况需要用双引号括起来.
    例如:

status: "\*\?()[]:=" 值含特殊字符的值, 推荐放在"中, 除了*?和需要转义外, 其他不用转义
status: active\*test 值只包含*或?, 可以不用双引号
status: active\?test 值只包含*或?, 可以不用双引号
content: ()[]:= 非法

字段名转义

  • 字段名不能使用双引号, 包含特殊字符时直接使用\转义,
  • 包含中文, 字母, 数字, 下划线, 小横线等情况不需要用双引号, 其他情况需要.
  • 例如:
    "\*\(\1+1\)\?: abc") 字段不可以用双引号, 特殊字符用转义

__tag__\:__container_name__: abc 用转义
中文字段: abc" 中文不需要转义
"content": abc 非法, 字段名不能用双引号括起来

注意: 值用字符串用双引号括起来, 不支持单引号
e_search("domain: '/url/test.jsp'")是错误的, 只能e_search('domain: "/url/test.jsp"')

子串搜索

语法

e_search("子串")
e_search("字段名: 子串")

全文搜索

对所有字段进行搜索子串

样例 场景
e_search("active error") 多个子串搜索, 默认关系是OR
e_search('"active error"') 搜索完整带空格的子串
e_search('"错误"') 中文子串

字段搜索

对特定字段进行搜索

样例 场景
e_search("status: active") 子串搜索
e_search('author: "john smith"') 带空格子串搜索
e_search('fileld: active error') 相当于 field:active OR "error"

通配符搜索

* ? 匹配: *表示 0个或多个字符串, ? 表示一个字符, 也可以表示一个宽字符如中文.

全文搜索

对所有字段进行搜索子串

样例 场景
e_search("active*test") 匹配0到多个, 不需要用双引号括起来
e_search("发生*错误") 中文匹配, 可以匹配发生错误, 发生严重错误
e_search("active?good") ? 可以不用双引号
e_search("ac*tive?good") 也可以应用于完全匹配
e_search("ac*tive??go*od") 支持多个混合使用

字段搜索

对特定字段进行搜索子串

样例 场景
e_search("status: active*test") 匹配0到多个
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(r'status~= "\d+"') status字段包含数字
e_search(r'status~= "^\d+$"') status字段等于数字

数值比较

范围类比较

语法

这里是左右闭区间, 支持*表示无边界.

e_search("字段: [左值, 右值]"   # >= 左值, <= 右值
e_search("字段: [*, 右值]")        # <= 右值
e_search("字段: [左值, *]")        #  >= 左值

样例

e_search('count: [100, 200]')   # >=100 and  <=200
e_search('count: [*, 200]')   # <=200
e_search('count: [200, *]')   # >=200

数值直接比较

语法样例

直接使用>, >=, =, <, <=比较:

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

逻辑关系

全局逻辑关系

支持任意搜索之间的逻辑关系, 也支持用 ( ) 进行嵌套.

逻辑 关键字
and AND && 大小写不敏感
or OR 双竖线 大写小不敏感
not ! 大小写不敏感

样例

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('field: ""') 字段存在(至少包含一个子空串)
e_search("not field:*") 字段不存在
e_search('not field:""') 字段不存在
e_search('field==""') 字段存在, 值为空
e_search('field~=".+"') 字段存在, 值不为空
e_search('not field~=".+"') 字段不存在或值为空
e_search('not field==""') 字段不存在或值不为空

进一步参考

欢迎扫码加入官方钉钉群获得实时更新与阿里云工程师的及时直接的支持:
日志服务数据加工: 查询字符串语法

上一篇:日志服务数据加工 - DSL语言介绍


下一篇:《SpringBoot揭秘:快速构建微服务体系》—第1章1.1节了解微服务