本文介绍日志服务索引所支持的数据类型,包括text、long、double和JSON。

数据类型

目前支持的索引数据类型如下所示。
查询类别 索引数据类型 说明 查询语句示例
基础查询 text 文本类型,支持关键词查询或模糊匹配,支持中文分词 uri:"login*" method:"post"
long 数值类型,支持区间查询。 status>200, status in [200, 500]
double 带浮点数的数值类型。 price>28.95, t in [20.0, 37]
组合查询 JSON 内容为JSON字段,默认为text类型,支持嵌套模式。可以通过a.b等路径格式给a层中的b元素设置索引,支持的字段类型有text、long、double。 level0.key>29.95 level0.key2:"action"
text 整条日志当做文本进行查询。 error and "login fail"

文本类型(text)

查询文本类型(text)日志是基于词(Term)的命中,需要在配置索引时配置分词符、大小写敏感、包含中文等参数。

全文索引默认会将整条日志(除Time以外所有字段)作为文本类型,不需要指定Key。

示例:开启全文索引,查询如下日志(字段包括time、status、level、message)。
  • 日志样例
    time:2018-01-02 12:00:00
    level:”error”
    status:200
    message:”some thing is error in this field”
  • 操作示例
    • 查询语句中不需要输入前缀,例如查询error,则levelmessage两个字段中error都会被命中。
    • 设置合适的分词符,例如设置分词符为空时,则status:200作为一个词;分词符设置为冒号(:)时,则拆分为status200两个词。
    • 数值类型会被作为文本处理,例如查询200可以查询到该日志。
      说明 时间字段(time)不会被作为文本处理。
    • 在搜索框中输入Key(例如status)时整条日志都会被命中。

数值类型(long、double)

数值类型包括long(长整数)类型和double(小数)类型,当字段类型设置为long或double时,对于该字段的查询只能通过数值范围进行查询。
说明
  • 如果设置成long类型,而实际值带有小数,则无法查询。
  • 如果设置成数值类型(long、double),而实际值是字符串,则无法查询。
  • 如果日志中某数值字段不存在,则使用not key:*进行查询。
  • 如果是非法的数值类型,则使用not key > -1000000进行查询,表示查询所有有效数值之外的日志,其中-100000替换成您日志中最小的数值。
示例:查询Value范围为(1000 2000]的Key,可以使用以下查询方式。
  • 数值类型查询语法
      longKey > 1000 and longKey <= 2000
  • 数值区间查询语法
      longKey in (1000 2000]

JSON类型

JSON是由文本、布尔、数值、数组(Array)和图(Map)构成的组合类型数据。JSON数据作为一种通用类型的数据类型,其自解析、灵活的特性,使其能够很好满足复杂场景下数据的记录需求,在很多日志内容中格式不固定的部分往往都是以JSON的形式进行记录,例如将一次http请求的request参数和response内容以JSON的形式记录在一条日志中。

日志服务支持在索引中将字段类型设置为JSON类型,支持查询分析JSON格式日志。 查询JSON类型字段需要加上JSON中父路径的前缀,文本类型、数值类型的查询语法详情请参见查询语法
说明
  • 不支持JSON对象和JSON数组。
  • 字段不能在JSON数组中。
  • bool类型字段可以转成text类型。
  • 查询分析时,JSON类型字段需要用双引号括起来。
  • 支持JSON格式解析,所有text类型、bool类型的数据自动索引。
    json_string.key_map.key_text : test_value
    json_string.key_map.key_bool : true
  • 非JSON数组中的数值类型(double、long)数据,可通过配置指定JSON路径后进行查询。
    • 配置索引:key_map.key_long字段类型配置为long。
    • 查询语句:json_string.key_map.key_long > 50
  • 非JSON数组中的数值类型(double、long)和文本类型(text)数据,可开启统计功能,进行SQL分析。
    json_string.key_map.key_long > 10 | select count(*) as c , 
        "json_string.key_map.key_text" group by 
        "json_string.key_map.key_text"
  • 支持解析非完全合法的JSON数据

    日志服务会尽可能解析有效内容,直到遇到非法部分结束。

    例如以下示例在key_3之后的数据被截断丢失,对于这种缺失的日志,日志服务可正确解析到json_string.key_map.key_2 这个字段。

    "json_string": 
    {
         "key_1" :  "value_1",
         "key_map" : 
          {
                 "key_2" : "value_2",
                 "key_3" : "valu
  • 日志样例

    日志样例中除时间字段外,还包含4个字段,其中message字段是JSON格式。

    序号 Key 类型
    0 time 不涉及
    1 class text
    2 status long
    3 latency double
    4 message json
    0. time:2018-01-01 12:00:00
      1. class:central-log
      2. status:200
      3. latency:68.75
      4. message:
      {  
          "methodName": "getProjectInfo",
          "success": true,
          "remoteAddress": "1.1.1.1:11111",
          "usedTime": 48,
          "param": {
                  "projectName": "ali-log-test-project",
                  "requestId": "d3f0c96a-51b0-4166-a850-f4175dde7323"
          },
          "result": {
              "message": "successful",
              "code": "200",
              "data": {
                  "clusterRegion": "ap-southeast-1",
                  "ProjectName": "ali-log-test-project",
                  "CreateTime": "2017-06-08 20:22:41"
              },
              "success": true
          }
      }
  • 配置索引配置索引
    • ①表示可查询json字段中所有文本类型和bool类型的数据。
    • ②表示可查询long类型数据。
    • ③表示配置的字段可进行SQL分析。
  • 查询语句
    • 查询文本类型和bool类型的日志
      说明
      • JSON内字段无需配置。
      • JSON图、JSON数组自动展开,支持多层嵌套,每一层以英文点号(.)进行分割。
      message.traceInfo.requestId : 92.137_1518139699935_5599
      message.param.projectName : ali-log-test-project
      message.success : true
      message.result.data.ProjectStatus : Normal
      日志样例
    • 查询double类型、long类型的数据
      说明 需要对JSON内字段独立配置,字段必须不在数组中。
      message.usedTime > 40
    • SQL统计分析
      说明
      • 需要对json内字段独立配置,字段必须不在数组中。
      • 查询字段需要使用双引号(""),或者设置别名。
      * | select avg("message.usedTime") as avg_time ,
      "message.methodName"  group by "message.methodName"
    • 组合查询
      class : cental* and message.usedTime > 40 not message.param.projectName:ali-log-test-project