本文以电商平台的订单系统日志为例,介绍 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 函数的使用示例。
场景:查询 CUST987654321 用户所有订单的详细信息。
检索语句
customer.customer_id:CUST987654321
检索结果
场景:查询用户 ID 以 CUST98
开头的所有订单的详细信息。
检索语句
customer.customer_id:CUST98*
使用模糊查询时,需在关键词中添加通配符星号(*)或者问号(?)。详细说明请参考日志检索。
检索结果
场景:查询用户地址为 Guangzhou 的所有请求信息。
检索分析语句
customer.address: Guangzhou
customer.address
字段已配置键值索引并开启分词符功能,因此日志服务会基于分词符将字段值拆分为多个关键词,并支持上述键值查询。
检索分析结果
场景:查询用户地址包含 123 Main St
街道的所有请求信息。
检索分析语句
customer.address:"123 Main St"
其中,123 Main St
为三个关键字包含空格,因此通过 123 Main St
进行检索时需使用双引号("")包裹。
检索分析结果
场景:查看某用户在指定订单中购买的第二件商品。
检索分析语句
说明
在 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 函数。检索分析结果
场景:统计最近一个月各个用户的订单数量。
检索分析语句
说明
在 SQL 语句中,需要使用单引号('')包裹代表字符串的字符,无符号包裹或被双引号("")包裹的字符为字段名或列名。其中,JSON 字段(例如 customer.customer_id),必须使用双引号("")包裹。
*| SELECT "customer.customer_id", COUNT(*) AS "订单数量" GROUP BY "customer.customer_id"
检索分析结果
场景:统计支付费用 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 "城市"
子句用于按照城市分组来统计各个城市的支付费用。检索分析结果