成喆
2019-07-20
2547浏览量
搜索字符串是ETL语言中用于快速过滤的语法, 语法基本上与日志服务的查询语法, 以及lucene 语法相同. 可以极大简化数据加工的条件判断的逻辑.
如下函数会使用到查询字符串语法.
类型 | 函数 | 使用场景 |
---|---|---|
表达式函数-事件判断函数 | e_search | 使用查询字符串判断事件的字段值是否满足特定条件, 返回True或False |
表达式函数-资源函数 | res_log_logstore_pull | 拉取Logstore资源返回表格, 构建表格中, 使用查询字符串配置黑白名单, 来判断每行是保留还是丢弃. |
全局事件函数-搜索表格映射 | e_search_table_map | 关键字是查询字符串, 值是匹配的值的字典进行映射 |
功能 | 字段 | 全文 |
---|---|---|
子串搜索 | 支持 | 支持 |
通配符*? 搜索 |
支持 | 支持 |
完全匹配搜索 | 支持 | - |
正则表达式搜索 | 支持 | - |
数值范围搜索 | 支持 | - |
数值比较 | 支持 | - |
关系and, or, not以及自由组合 | 支持 | 支持 |
"
, \
时需要用\
转义.content: "abc\"xy\\z"
合法
*
, ?
时, 也需要用\
转义, 否则会被视为通配符匹配*
, ?
等情况不需要用双引号, 其他情况需要用双引号括起来. 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==""') |
字段不存在或值不为空 |
欢迎扫码加入官方钉钉群获得实时更新与阿里云工程师的及时直接的支持:
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。