本文档为您介绍查询字符串时的一些通用语法规则。

查询字符串语法是LOG DSL中用于快速过滤数据的语法,可以简化条件判断。

函数列表

如下函数会使用到查询字符串语法。
类型 函数 场景
事件检查函数 e_search 使用查询字符串判断事件的字段值是否满足特定条件。
资源函数 res_log_logstore_pull 从Logstore中获取并返回表格结构的数据,支持使用查询字符串配置黑白名单进行过滤筛选。
res_rds_mysql 从RDS-MySQL中获取并返回表格结构的数据,支持使用查询字符串配置黑白名单进行过滤筛选。
事件映射函数 e_search_table_mape_search_dict_map 对关键字是查询字符串,以及其匹配的值的字典数据进行映射。

功能概览

不同搜索功能对字段搜索和全文搜索的支持情况如下。
功能 字段搜索 全文搜索
子串搜索 支持 支持
通配符*?搜索 支持 支持
完全匹配搜索 支持 不支持
正则表达式搜索 支持 不支持
数值范围搜索 支持 不支持
数值比较 支持 不支持
关系and,or,not及组合 支持 支持

字符转义

在字符串查询语法中,需要对一些特殊字符如*\等进行转义操作。

字段名转义
  • 字段名不能使用双引号,包含特殊字符时使用\转义。
  • 包含中文、字母、数字、下划线或小横线等不需要用双引号。例如:
    • "\*\(\1+1\)\?: abc"):不用双引号,特殊字符用\转义。
    • __tag__\:__container_name__: abc:不用双引号,特殊字符用\转义
    • 中文字段: abc":不用双引号,中文不需要转义。
    • "content": abc:非法,字段名不能用双引号括起来。
搜索值转义
  • 包含"\时需要用\转义。
    例如:content: "abc\"xy\\z"
    说明 不同于基础语法的字符串表示,可以用' " 将字符串括起来,这里只能用"包裹字符串。所以推荐用户外围用'来表示字符串,里面的字符串可以用"。例如:e_search('field1:"字符串" ')
  • 要搜索*?时需要用\转义,否则会被视为通配符匹配。
  • 包含中文、字母、数字、下划线、小横线、*?等情况不需要用双引号,其他情况需要用双引号括起来。例如:
    • status: "\*\?()[]:=":字段值包含特殊字符,推荐使用双引号括起来,并对*?\进行转义,其他字符不用转义。
    • content: ()[]:=:非法,需要使用双引号括起来。
    • status: active\*test:字段值仅包含*?,只需要对*?进行转义,不需要使用双引号。
    • status: active\?test:字段值仅包含*?,只需要对*?进行转义,不需要使用双引号。
说明 值用双引号括起来,不支持单引号。例如e_search("domain: '/url/test.jsp'")是错误的,正确的为e_search('domain: "/url/test.jsp"')

子串搜索

子串搜索的两种方式,全文搜索和字段搜索,如下所示。

全文搜索:在所有字段中搜索子串。
  • 语法格式
    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('fileld: active error'):相当于field:active OR "error",表示在field中搜索active或者全文搜索error。

通配符搜索

*表示0个或多个字符串,?表示一个字符,也可以表示一个宽字符如中文。通配符搜索的两种方式如下所示。

全文搜索:在所有字段中搜索子串。
  • 语法格式
    e_search('子串')
  • 示例
    • e_search('active*test'):匹配0到多个,*不需要用双引号。
    • e_search('发生*错误'):匹配0到多个,可以匹配发生错误发生严重错误等。
    • e_search('active?good'):匹配一个,? 不需要用双引号。
    • e_search('ac*tive?good'):可以应用于完全匹配。
    • e_search('ac*tive??go*od'):支持多个混合使用。
字段搜索:在特定字段中搜索子串。
  • 语法格式
    e_search('字段名: 子串')
  • 示例
    • e_search('status: active*test'):匹配0到多个。
    • e_search('status: active?good'):匹配一个。

完全匹配

完全匹配要求对字段值从开始到结尾完全匹配。
  • 语法格式
    e_search(r'字段名~="正则表达式字符串"')
  • 示例
    • 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('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

逻辑关系

支持任意搜索之间的逻辑关系,也支持用( )进行嵌套。
逻辑关系 关键字
andAND&&等,不区分大小写。
orOR等,不区分大小写。
notNOT!等,不区分大小写。
样例:
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==""'):字段不存在或值不为空。