在 Elasticsearch 中解析 JSON 字段

作者:来自 Elastic Valentin Crettaz

学习如何在 Elasticsearch 中使用 ingest pipeline 来高效地索引、查询和聚合 JSON 数据。

初次接触 Elasticsearch?加入我们的 Elasticsearch 入门网络研讨会吧。你也可以立即开始免费的云端试用,或在本地运行 Elastic。

在本文中,我们将讨论如何在 Elasticsearch 中解析 JSON 字段,这是处理日志数据或其他结构化数据格式时的常见需求。我们将涵盖以下主题:

  • 将 JSON 数据导入 Elasticsearch

  • 使用 Ingest Pipeline 解析 JSON 字段

  • 查询和聚合 JSON 字段

1. 将 JSON 数据导入 Elasticsearch

在将 JSON 数据导入 Elasticsearch 时,确保数据格式和结构正确非常重要。Elasticsearch 可以自动检测并映射 JSON 字段,但建议定义显式映射,以更好地控制索引过程。

要创建带有自定义映射的索引,可以使用以下 API 调用:

bash 复制代码
`

1.  PUT /my_index
2.  {
3.   "mappings": {
4.     "properties": {
5.       "message": {
6.         "type": "keyword"
7.       },
8.       "json_field": {
9.         "properties": {
10.           "field1": {
11.             "type": "keyword"
12.           },
13.           "field2": {
14.             "type": "integer"
15.           }
16.         }
17.       }
18.     }
19.   }
20.  }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

在这个示例中,我们创建了一个名为 my_index 的索引,并为一个名为 json_field 的 JSON 字段定义了自定义映射。

2. 使用 Ingest Pipeline 解析 JSON 字段

如果你的 JSON 数据以字符串形式存储在某个字段中,可以使用 Elasticsearch 的 Ingest Pipeline 功能来解析该 JSON 字符串并提取相关字段。Ingest Pipeline 提供了一组内置处理器,其中包括 json 处理器,可用于解析 JSON 数据。

要创建一个包含 json 处理器的 ingest pipeline,请使用以下 API 调用:

markdown 复制代码
`

1.  PUT _ingest/pipeline/json_parser
2.  {
3.   "description": "Parse JSON field",
4.   "processors": [
5.     {
6.       "json": {
7.         "field": "message",
8.         "target_field": "json_field"
9.       }
10.     }
11.   ]
12.  }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

在这个示例中,我们创建了一个名为 json_parser 的 ingest pipeline,它会解析存储在 message 字段中的 JSON 字符串,并将解析后的 JSON 对象存储到一个名为 json_field 的新字段中。

要使用此 pipeline 索引文档,请使用以下 API 调用:

swift 复制代码
`

1.  POST /my_index/_doc?pipeline=json_parser
2.  {
3.   "message": "{\"field1\": \"value1\", \"field2\": 42}"
4.  }

`AI写代码

该文档将以解析后的 JSON 字段形式被索引:

swift 复制代码
`

1.  {
2.   "_index": "my_index",
3.   "_type": "_doc",
4.   "_id": "1",
5.   "_source": {
6.     "message": "{\"field1\": \"value1\", \"field2\": 42}",
7.     "json_field": {
8.       "field1": "value1",
9.       "field2": 42
10.     }
11.   }
12.  }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

3. 查询和聚合 JSON 字段

一旦 JSON 字段被索引,就可以使用 Elasticsearch Query DSL 对其进行查询和聚合。例如,要搜索在 field1 子字段中具有特定值的文档,可以使用以下查询:

bash 复制代码
`

1.  POST /my_index/_search
2.  {
3.   "query": {
4.         "term": {
5.           "json_field.field1": "value1"
6.         }
7.   }
8.  }

`AI写代码

额外提示:如何处理未解析的 JSON 数据?

如果你已经将未解析的 JSON 数据导入到 text/keyword 字段中,不必从头重新索引,也有办法提取其中的 JSON 数据。

你可以利用第 2 节中创建的 ingest pipeline,结合 Update by Query API 来完成这一操作。但在执行更新之前,需要像第 1 节中那样更新索引映射,为 json_field 添加映射,可以通过运行以下命令实现:

bash 复制代码
`

1.  PUT /my_index/_mapping
2.  {
3.    "properties": {
4.      "json_field": {
5.        "properties": {
6.          "field1": {
7.            "type": "keyword"
8.          },
9.          "field2": {
10.            "type": "integer"
11.          }
12.        }
13.      }
14.    }
15.  }

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

完成后,你可以直接运行以下命令,它会遍历索引中的所有文档,从 message 字段中提取 JSON,并将解析后的 JSON 数据索引到 json_field 对象中。

ini 复制代码
`POST /my_index/_update_by_query?pipeline=json_parser`AI写代码

结论

总之,在 Elasticsearch 中解析 JSON 字段可以通过自定义映射、Ingest Pipeline 功能以及 Elasticsearch Query DSL 来实现。通过遵循这些步骤,你可以在 Elasticsearch 集群中高效地索引、查询和聚合 JSON 数据。

原文:www.elastic.co/search-labs...

相关推荐
Elasticsearch6 小时前
什么是混合搜索?
elasticsearch
Elasticsearch12 小时前
从点击流中提升搜索相关性:使用 Learn To Rank 和 OpenTelemetry 行为信号
elasticsearch
倒流时光三十年13 小时前
第六阶段 57 · ES|QL 与 SQL API(用 SQL 查 ES)
数据库·sql·elasticsearch
guwentian1 天前
Git Worktree 实战:用并行多 Agent 把开发提速 N 倍
大数据·git·elasticsearch·wroktree
Elastic 中国社区官方博客1 天前
Elasticsearch:使用 AI Agent 来创建 workflow
大数据·运维·人工智能·elasticsearch·搜索引擎·自动化·全文检索
阿里云大数据AI技术1 天前
AI Search+ES 9.4.X最佳实践:“更快、更准、更安全的企业级搜索引擎”"为AI Agent提供坚实底座”
人工智能·elasticsearch·agent
Elasticsearch1 天前
Elastic 社区通讯 — 2026 年 8 月
elasticsearch
lsh曙光1 天前
ES数据备份与恢复
大数据·elasticsearch·搜索引擎
Shawn Dev1 天前
MySQL Binlog 数据误删除恢复完全指南
数据库·mysql·elasticsearch
Elastic 中国社区官方博客2 天前
用两行 JSON 替换你的 ILM 策略:数据流生命周期新增冻结层支持
大数据·运维·elasticsearch·搜索引擎·架构·全文检索