您在建立索引时,可将字段的数据类型设置为text、long、double或JSON。本文介绍各个数据类型的配置示例及注意事项。

text类型

如果您要查询和分析字符串类型的字段,需在配置索引时,将字段的数据类型设置为text,并开启统计功能。
说明 开启全文索引后,日志服务默认将整条日志(除__time__以外所有字段)设置为text类型。
  • 日志样例text日志样例
  • 配置索引text索引
  • 查询和分析语句
    • 查询非GET请求的日志。
      not request_method : GET
    • 查询以cn开头的日志。
      cn*
    • 统计客户端分布情况。
      * | SELECT ip_to_province(client_ip) as province, count(*) AS pv GROUP BY province ORDER BY pv

long和double类型

设置字段的数据类型为long或double后,您才能通过数值范围查询该字段的值。
  • 如果日志字段的值为整数类型,建议您在配置索引时,将字段的数据类型设置为long。
  • 如果日志字段的值为浮点数类型,建议您在配置索引时,将字段的数据类型设置double。
注意
  • 如果设置数据类型为long,而实际字段值为浮点数类型,则无法查询该字段。
  • 如果设置数据类型为long或double,而实际字段值为字符串类型,则无法查询该字段。
  • 如果设置数据类型为long或double,则不支持使用星号(*)或问号(?)进行模糊查询。
  • 如果字段的值为非法的数值,则使用not key > -1000000语句进行查询,表示查询所有有效数值之外的日志,其中-100000为足够小的值即可。
  • 日志样例text日志样例
  • 配置索引text索引
  • 查询和分析语句
    • 查询请求时间大于60秒的日志。
      request_time > 60
    • 查询请求时间大于等于60秒,并且小于200秒的日志。
      • request_time in [60 200)
      • request_time >= 60 and request_time < 200
    • 查询请求状态码为200的日志。
      status = 200

JSON类型

如果字段的值为JSON类型,您可在配置索引时,将字段的数据类型设置为JSON。
  • 针对JSON对象中的字段,您可根据其值,将数据类型设置为long、double或text,并开启统计功能。开启统计功能后,日志服务支持您查询和分析JSON对象中的字段。
  • 针对非完全合法的JSON数据,日志服务支持解析合法部分。

    例如以下为非完整的JSON日志,日志服务可正确解析conctent.remote_addr字段、content.request.request_length字段和content.request.request_method字段。

    content: {
         remote_addr:"192.0.2.0"
         request: {
                 request_length:"73"
                 request_method:"GE
注意
  • 日志服务支持JSON对象中的叶子节点建立索引,但不支持包含叶子节点的子节点建立索引。
  • 日志服务不支持值为JSON数组的字段建立索引,也不支持JSON数组中的字段建立索引。
  • 如果字段的值为Boolean类型,则您可以在建立索引时,将字段的数据类型设置为text。
  • 查询和分析语句格式为查询语句|分析语句。在分析语句中,您必须使用双引号("")包裹字段名称,使用单引号('')包裹字符串。
  • 日志样例

    JSON日志样例如下所示,除日志服务保留字段外,还包括class字段、latancy字段、status字段和info字段。其中info字段的值是JSON对象,并存在多层嵌套。

    JSON日志样例
  • 配置索引配置索引
    相关说明如下:
    • IP字段和data字段的值为JSON数组,所以您无法为IP字段和data字段建立索引,也无法通过这两个字段进行查询和分析。
    • region字段和CreateTime字段在JSON数组中,所以您无法为region字段和CreateTime字段建立索引,也无法通过这两个字段进行查询和分析。
  • 查询和分析语句
    • 查询usedTime字段的值大于60秒的日志。
      info.usedTime > 60
    • 查询success字段的值为true的日志。
      info.success : true
    • 查询usedTime字段的值大于60秒且projectName的值不为project01的日志。
      info.usedTime > 60 not info.param.projectName : project01
    • 计算获取Project信息的平均时长。
      methodName = getProjectInfo | SELECT avg("info.usedTime") AS avg_time