You need to enable JavaScript to run this app.
导航

索引数据类型

最近更新时间2024.01.22 17:33:41

首次发布时间2022.11.18 10:32:18

为日志数据建立键值索引时,您可以将字段的数据类型设置为 text、long、double 或 json。本文介绍各个数据类型的配置说明及注意事项。

数据类型

在日志服务中为日志字段设置键值索引时,需要为每个开启键值索引的字段设置数据类型。索引字段的数据类型设置决定了您可以用何种方式检索该字段的数据,同时影响检索的精度和准确性。
常见场景下,日志数据的字段值通常为文本类型或数值类型,您可以根据实际的字段值设置 text(字符串)、long(整型)或 double(浮点型)类型的键值索引,满足日志检索需求。对于 JSON 等相对更加复杂的结构化数据,您也可以配置 JSON 类型的键值索引,日志服务支持展开标准合法的 JSON 字段,为其叶子节点设置 text、long 或 double 类型的键值索引,以满足 JSON 嵌套结构的叶子节点字段检索需求。
各索引字段的数据类型说明如下:

类型

说明

text

适用于字符串类型的字段。

long

适用于数值类型的字段,例如整型(Int 64)。字段类型设置为 long 之后,您可以通过数值范围查询日志字段,例如使用>等范围操作符语法进行检索。

double

适用于数值类型的字段,例如浮点型(64 bit)。字段类型设置为 double 之后,您可以通过数值范围查询日志字段,例如使用>等范围操作符语法进行检索。

json

适用于 JSON 类型的字段。日志服务支持对标准 JSON 类型字段建立索引,即字段类型设置为 json 后,可以设置其展开后每个子字段的数据类型。

text 类型

text 类型适用于字符串类型的字段。

  • 可以使用通配符(*或?)对该字段进行模糊检索。
  • 开启全文索引后,日志服务默认将整条日志(除 __time__ 以外所有字段)设置为 text 类型。
  • 字段类型设置为 text 时,不支持同时启用分词符和包含中文,启用统计后,不支持包含中文和分词设置。

long 类型

long 类型适用于数值类型的字段,例如整型(Int 64)。字段类型设置为 long 之后,您可以通过数值范围查询日志字段,例如使用>等范围操作符进行检索。

  • 如果将浮点数类型、字符串类型的字段数据类型设置为 long,则无法查询该字段。
  • long 类型的字段不支持设置大小写敏感包含中文分词符, 且不支持模糊查询。

double 类型

double 类型适用于数值类型的字段,例如浮点型(64 bit)。字段类型设置为 double 之后,您可以通过数值范围查询日志字段,例如使用>等范围操作符进行检索。

  • 如果将字符串类型的字段数据类型设置为 double,则无法查询该字段。
  • double 类型的字段不支持设置大小写敏感包含中文分词符,且不支持模糊查询。

json 类型

json 类型适用于格式为 JSON 对象的字段。日志服务支持对标准 JSON 类型字段建立索引,即字段类型设置为 json 后,可以设置其展开后每个子字段的数据类型。
设置方式

  • 对于 JSON 对象中的每个子字段,可以根据其实际数据类型,将字段类型设置为 text、long、double。设置后,检索和分析时的粒度可以精确到子字段。
  • 如果子字段的值为 Boolean 类型,则您可以在建立索引时,将字段的数据类型设置为 text。

子字段名称规则

  • 配置 JSON 数据子字段的键值索引时,您可通过.来表示JSON数据结构中子字段之间的层级关系,例如 key1.key2.key3 表示 key2key1 的子字段且 key3key2 的子字段,子字段的名称不包含最顶层配置为 JSON 类型的根字段名。
  • 配置 JSON 数据子字段的键值索引时,各个子字段名称不允许存在数据类型冲突的前缀父字段,即不允许同时配置 key1.key2key1.key2.key3 两个子字段,但您可同时配置 key1.key2.key3key1.key2.key4 两个子字段。

设置限制

  • 日志服务不支持值为 JSON 数组的字段建立索引,也不支持 JSON 数组中的字段建立索引。
  • 仅支持在 JSON 字段维度设置大小写敏感包含中文分词符开启统计等键值索引配置,text 子字段默认沿用 JSON 字段的键值索引配置,不支持单独设置。
  • 最多支持 20 层的 JSON 嵌套,即日志服务在某个 JSON 子字段中只能解析其最多 19 层数据。

异常场景处理

  • 对于不合法的 JSON 对象,日志服务仅解析其标准合法的部分。
  • 若日志服务检测到您在键值索引配置的 JSON 子字段和实际日志字段值的数据类型不符时,则整个 JSON 日志数据不可检索和分析。例如实际字段值为 zhangsan,字段类型设置为 double,此时整个 JSON 对象中的所有字段均不可检索分析。
  • 日志服务支持 JSON 对象中的叶子节点建立索引,但不建议为包含叶子节点的子节点建立索引。若您为 JSON 对象中嵌套 JSON 对象建立索引,日志服务将把该子字段处的 JSON 对象值序列化成字符串处理。

配置样例

例如在应用服务日志的采集场景下,每一条日志表示一次用户请求,其中,info 字段为 JSON 对象格式的字段,表示某次服务请求的详细信息,info 字段中还嵌套了 JSON 对象格式的字段 response 和 developers。
日志样例如下:

{
    "product":"NewApp",
    "total_users":1000000,
    "avg_pv_per_day":1000000.0,
    "regions":[
        "cn-beijing",
        "cn-shanghai"
    ],
    "info":{
        "api":"CreateIndex",
        "ip":[
            "192.168.1.101",
            "192.168.1.102"
        ],
        "request_time":1667232000,
        "latency_time":0.01,
        "response":{
            "request_id":"a**********",
            "status":200,
            "error_msg":""
        },
        "developers":[
            {
                "name":"张三",
                "email":"zhangsan@test.com"
            },
            {
                "name":"李四",
                "email":"lisi@test.com"
            }
        ]
    }
}

索引配置如下:

  • info 字段配置 JSON 类型的键值索引,其中的子字段根据字段类型设置对应的索引。深层的 response.error_msg、response.status 叶子节点子字段配置相应基本数据类型的键值索引。
  • 由于 regions 字段值是数组类型,日志服务不支持您在 regions 字段上配置有效的 JSON 键值索引并进行检索和分析。同样,info 对象中的 ip 和 developers 子字段为数组值形式,您也无法为子字段 name 和 email 配置索引,也无法基于这些字段进行检索和分析。

图片
检索分析示例如下:

分析场景

分析语句

检索包含 NewApp 的日志

NewApp

检索总用户量大于 10000 且日均访问量大于 10000.0 的日志

total_users: >10000 AND avg_pv_per_day: >10000.0

查看全部日志

* | SELECT *

筛选产品名称为 NewApp 的日志

* | SELECT * WHERE product='NewApp'

筛选总用户量大于 10000,且日均访问量大于 10000.0 的日志

* | SELECT * WHERE total_users>10000 AND avg_pv_per_day>10000.0

筛选请求 API 为 CreateIndex 的日志

* | SELECT * WHERE info.api='CreateIndex'

统计响应状态码不为200的日志数量

* | SELECT COUNT(*) WHERE info.response.status<>200

统计按照请求 NewApp API 进行聚合的日志数量

* | SELECT info.api, COUNT(*) AS c WHERE product='NewApp' GROUP BY info.api