You need to enable JavaScript to run this app.
导航
检索分析 JSON 日志
最近更新时间:2024.06.04 14:11:41首次发布时间:2024.06.04 14:11:41

本文以电商平台的订单系统日志为例,介绍 JSON 格式日志的典型检索分析场景及示例。

背景信息

某电商公司的订单系统每天需要处理成千上万笔的交易请求,并生成海量的 JSON 格式日志。这些 JSON 日志详细记录了每个订单的详细信息,例如用户信息(用户 ID、用户地址、用户昵称等)、购买信息(商品 ID、商品名称、商品价格、商品数量)、订单信息(订单 ID、订单总价、订单状态、支付方式、快递时间等)等。
面对电商公司订单系统产生的复杂 JSON 日志,日志服务不仅是一个存储仓库,更是一个强大的分析平台。日志服务提供 JSON 类型的索引配置,极大增强了对 JSON 日志的结构化管理效率,实现复杂结构中的字段内容也能被精准索引。日志服务还内置了丰富的 JSON 函数,支持高效的日志解析和内容提取。

前提条件

  • 已创建日志项目和日志主题。具体操作,请参考创建资源
  • 已根据日志字段创建索引。具体操作,请参考配置索引

日志样例

下述罗列了订单系统 JSON 日志样例。

{
    "timestamp": "2024-05-14T12:30:45Z",
    "order_id": "ODR123456789",
    "customer": {
        "customer_id": "CUST987654321",
        "name": "John Doe",
        "email": "john.doe@example.com",
        "address": {
            "street": "123 Main St",
            "city": "Anytown",
            "state": "NY",
            "zip": "12345",
            "country": "USA"
        }
    },
    "items": [
        {
            "product_id": "PROD001",
            "name": "Widget",
            "quantity": 2,
            "price": 9.99,
            "total_price": 19.98
        },
        {
            "product_id": "PROD002",
            "name": "Gadget",
            "quantity": 1,
            "price": 14.99,
            "total_price": 14.99
        }
    ],
    "subtotal": 34.97,
    "tax": 2,
    "total": 36.97,
    "status": "shipped",
    "shipping_method": "express",
    "payment_method": "credit_card",
    "shipping_address": {
        "street": "456 Oak St",
        "city": "Othertown",
        "state": "CA",
        "zip": "54321",
        "country": "USA"
    },
    "billing_address": {
        "street": "456 Oak St",
        "city": "Othertown",
        "state": "CA",
        "zip": "54321",
        "country": "USA"
    },
    "shipping_cost": 10,
    "payment_status": "paid",
    "payment_amount": 36.97,
    "shipping_status": "delivered",
    "shipping_date": "2024-05-15",
    "notes": "此订单客户要求24小时内尽快发货"
}

索引样例

本案例基于上述日志样例创建了如下索引配置。索引配置的具体操作及注意事项,请参考配置索引。
其中,customer 字段是 JSON 对象,日志服务支持对 customer 字段内的子字段设置索引,并支持字段检索分析。关于 JSON 数据类型索引的详细说明及注意事项请参考json 类型
图片

典型检索分析场景

通过 JSON 日志介绍 JSON 字段的检索分析示例和 JSON 函数的使用示例。

场景 1:根据用户 ID 精准查询相关订单

  • 场景:查询 CUST987654321 用户所有订单的详细信息。

  • 检索语句

    customer.customer_id:CUST987654321
    
  • 检索结果

场景 2:根据用户 ID 模糊查询相关订单

  • 场景:查询用户 ID 以 CUST98 开头的所有订单的详细信息。

  • 检索语句

    customer.customer_id:CUST98*
    

    使用模糊查询时,需在关键词中添加通配符星号(*)或者问号(?)。详细说明请参考日志检索

  • 检索结果

场景 3:根据某个关键词查询相关订单

  • 场景:查询用户地址为 Guangzhou 的所有请求信息。

  • 检索分析语句

    customer.address: Guangzhou
    

    customer.address 字段已配置键值索引并开启分词符功能,因此日志服务会基于分词符将字段值拆分为多个关键词,并支持上述键值查询。

  • 检索分析结果

场景 4:根据多个关键字查询相关订单

  • 场景:查询用户地址包含 123 Main St 街道的所有请求信息。

  • 检索分析语句

    customer.address:"123 Main St"
    

    其中,123 Main St为三个关键字包含空格,因此通过 123 Main St 进行检索时需使用双引号("")包裹。

  • 检索分析结果

场景 5:使用 JSON 函数提取 JSON 字段值

  • 场景:查看某用户在指定订单中购买的第二件商品。

  • 检索分析语句

    说明

    在 SQL 语句中,需要使用单引号('')包裹代表字符串的字符,无符号包裹或被双引号("")包裹的字符为字段名或列名。其中,JSON 字段(例如 customer.customer_id),必须使用双引号("")包裹。

    *|SELECT JSON_EXTRACT_SCALAR(JSON_ARRAY_GET(JSON_PARSE(items), 0), '$.product_id') AS "商品ID" WHERE "customer.customer_id" = 'CUST987654321' AND order_id = 'ODR123456792'
    

    其中:

    • JSON_PARSE 函数用于将 JSON 格式的字符串(items 字段的值)转化成 JSON 类型,详细说明请参考JSON_PARSE 函数
    • JSON_ARRAY_GET 函数用于提取 items 字段值中的第一个元素(例如 **** "product_id":"PROD001"),详细说明请参考JSON_ARRAY_GET 函数
    • JSON_EXTRACT_SCALAR 函数用于从上述提取到的元素(例如"product_id":"PROD001")中提取 product_id 字段的值,详细说明请参考JSON_EXTRACT_SCALAR 函数
  • 检索分析结果

场景 6:分组统计订单数量

  • 场景:统计最近一个月各个用户的订单数量。

  • 检索分析语句

    说明

    在 SQL 语句中,需要使用单引号('')包裹代表字符串的字符,无符号包裹或被双引号("")包裹的字符为字段名或列名。其中,JSON 字段(例如 customer.customer_id),必须使用双引号("")包裹。

    *| SELECT "customer.customer_id", COUNT(*) AS "订单数量" GROUP BY "customer.customer_id"
    
  • 检索分析结果

场景 7:分组统计支付费用

  • 场景:统计支付费用 TOP 10 的城市。

  • 检索分析语句

    说明

    在 SQL 语句中,需要使用单引号('')包裹代表字符串的字符,无符号包裹或被双引号("")包裹的字符为字段名或列名。其中,JSON 字段(例如 customer.customer_id),必须使用双引号("")包裹。

    *| SELECT JSON_EXTRACT_SCALAR("customer.address", '$.city') AS "城市", SUM(payment_amount) AS "支付费用" GROUP BY "城市" ORDER BY "支付费用" DESC LIMIT 10
    

    其中:

    • JSON_EXTRACT_SCALAR 函数用于从 JSON 形式的字符串中提取到 city 字段的值,详细说明请参考JSON_EXTRACT_SCALAR 函数
    • GROUP BY "城市" 子句用于按照城市分组来统计各个城市的支付费用。
  • 检索分析结果
    图片

相关文档