在 Elasticsearch 中解析 JSON 字段
作者:来自ElasticValentin Crettaz
了解如何使用摄取管道解析 Elasticsearch 中的 JSON 字段,以有效地索引、查询和聚合 JSON 数据。
Elasticsearch 新手?加入我们的 Elasticsearch 入门网络研讨会。您还可以开始免费的云试用或立即在您的机器上试用 Elastic。
在本文中,我们将讨论如何在 Elasticsearch 中解析 JSON 字段,这是处理日志数据或其他结构化数据格式时的常见需求。我们将涵盖以下主题:
- 将 JSON 数据导入 Elasticsearch
- 使用 Ingest Pipeline 解析 JSON 字段
- 查询和聚合 JSON 字段
1. 将 JSON 数据导入 Elasticsearch
在将 JSON 数据导入 Elasticsearch 时,确保数据格式和结构正确非常重要。Elasticsearch 可以自动检测并映射 JSON 字段,但建议定义显式映射,以更好地控制索引过程。
要创建带有自定义映射的索引,可以使用以下 API 调用:
PUT /my_index
{
"mappings": {
"properties": {
"message": {
"type": "keyword"
},
"json_field": {
"properties": {
"field1": {
"type": "keyword"
},
"field2": {
"type": "integer"
}
}
}
}
}
}
在这个示例中,我们创建了一个名为 my_index 的索引,并为一个名为 json_field 的 JSON 字段定义了自定义映射。
2. 使用 Ingest Pipeline 解析 JSON 字段
如果你的 JSON 数据以字符串形式存储在某个字段中,可以使用 Elasticsearch 的 Ingest Pipeline 功能来解析该 JSON 字符串并提取相关字段。Ingest Pipeline 提供了一组内置处理器,其中包括 json 处理器,可用于解析 JSON 数据。
要创建一个包含 json 处理器的 ingest pipeline,请使用以下 API 调用:
PUT _ingest/pipeline/json_parser
{
"description": "Parse JSON field",
"processors": [
{
"json": {
"field": "message",
"target_field": "json_field"
}
}
]
}
在这个示例中,我们创建了一个名为 json_parser 的 ingest pipeline,它会解析存储在 message 字段中的 JSON 字符串,并将解析后的 JSON 对象存储到一个名为 json_field 的新字段中。
要使用此 pipeline 索引文档,请使用以下 API 调用:
POST /my_index/_doc?pipeline=json_parser
{
"message": "{\"field1\": \"value1\", \"field2\": 42}"
}
该文档将以解析后的 JSON 字段形式被索引:
{
"_index": "my_index",
"_type": "_doc",
"_id": "1",
"_source": {
"message": "{\"field1\": \"value1\", \"field2\": 42}",
"json_field": {
"field1": "value1",
"field2": 42
}
}
}
3. 查询和聚合 JSON 字段
一旦 JSON 字段被索引,就可以使用 Elasticsearch Query DSL 对其进行查询和聚合。例如,要搜索在 field1 子字段中具有特定值的文档,可以使用以下查询:
POST /my_index/_search
{
"query": {
"term": {
"json_field.field1": "value1"
}
}
}
额外提示:如何处理未解析的 JSON 数据?
如果你已经将未解析的 JSON 数据导入到 text/keyword 字段中,不必从头重新索引,也有办法提取其中的 JSON 数据。
你可以利用第 2 节中创建的 ingest pipeline,结合Update by Query API来完成这一操作。但在执行更新之前,需要像第 1 节中那样更新索引映射,为 json_field 添加映射,可以通过运行以下命令实现:
PUT /my_index/_mapping
{
"properties": {
"json_field": {
"properties": {
"field1": {
"type": "keyword"
},
"field2": {
"type": "integer"
}
}
}
}
}
完成后,你可以直接运行以下命令,它会遍历索引中的所有文档,从 message 字段中提取 JSON,并将解析后的 JSON 数据索引到 json_field 对象中。
POST /my_index/_update_by_query?pipeline=json_parser
结论
总之,在 Elasticsearch 中解析 JSON 字段可以通过自定义映射、Ingest Pipeline 功能以及 Elasticsearch Query DSL 来实现。通过遵循这些步骤,你可以在 Elasticsearch 集群中高效地索引、查询和聚合 JSON 数据。
原文:https://www.elastic.co/search-labs/blog/elasticsearch-parse-json-field-ingest-pipeline
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
详解ROMA中复杂图表的渲染实现
一、背景 ROMA承接很多复杂图表的渲染需求,在京东金融APP内,特别是首页首屏的图表,对图表渲染的及时性要求很高。近期业务反馈频繁重启时,首页的黄金走势图偶现渲染不出的问题,通过梳理图表的渲染流程,对缓存策略、视图加载和渲染过程进行了重构,确保渲染成功率,提升了渲染速度以及补充了异常重试的功能。 二、使用场景分析 京东金融App内有很多使用复杂图表的业务场景,以下截取部分场景。下图分别是黄金历史金价的走势图、用户购买的基金的收益走势图、小金库的收益柱状图、用户投资诊断的雷达图、省钱账单和AI助手账单趋势柱状图。 可见,金融App内图表的使用具备种类丰富、数据信息量大,定制程度高、交互频繁等特点,经调研发现,Apache ECharts 是一个基于 JavaScript 的功能强大的开源可视化图表库,被广泛应用于数据分析、监控系统、报表工具等领域。并且支持定制支持的图表类型,可降低图标库的体积和提升图标库的加载速度。由于原生端并没有类似的图表库,因次决定在 ROMA 中引入 ECharts 来承接复杂图表的显示需求 。 三、重构过程分析 1、原理分析 ROMA 对外提供 echart...
-
下一篇
k8m v0.0.172 已经发布,轻量级的 Kubernetes 仪表板
k8m v0.0.172 已经发布,轻量级的 Kubernetes 仪表板 此版本更新内容包括: 更新内容 feat(lua脚本): 添加可配置的CPU和内存告警阈值 feat(lua): 添加 ResourceUsageResult 类型转换支持并优化资源检查脚本 refactor(lua): 重命名 GetResourceUsage 为 GetPodResourceUsage 并更新示例 feat(lua): 添加获取Pod资源用量的功能 feat(用户认证): 在JWT token中添加isPlatformAdmin字段用于前端展示平台管理员身份 fix(middleware): 添加用户名有效性检查 refactor: 清理冗余注释和优化代码注释结构 fix(cb): 在保存日志到数据库时添加角色错误日志记录 fix: 修复角色查询错误处理和空返回值问题 refactor(menuVisibility): 将userRole从字符串改为数组以支持多角色 fix(controller): 修复用户角色获取失败时的日志记录和角色返回格式 refactor(user): 移除未使用的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL数据库中FOR UPDATE的使用
- CentOS8编译安装MySQL8.0.19
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Windows10,CentOS7,CentOS8安装Nodejs环境
- MySQL表碎片整理
- SpringBoot2整合Redis,开启缓存,提高访问速度

微信收款码
支付宝收款码