Elasticsearch写入文档时同步向独立索引新增数据的方案问询
解决方案
针对你提出的写入person索引时自动同步语言到独立languages索引的需求,可根据你使用的版本选择对应方案:
方案1:适用于不支持Transform的旧版Open Distro for Elasticsearch
你可以从以下三个可选方案中按需选择:
- 业务层双写(最低实现成本)
无需修改Elasticsearch侧配置,直接在业务代码写入person索引的逻辑后追加逻辑:遍历当前文档的languages数组,逐个向languages索引发起upsert请求,文档ID设置为语言值,重复请求只会更新不会新增重复文档,示例请求如下:
用PUT languages/_doc/english?op_type=create { "value": "english" }op_type=create参数即可实现不存在则写入、存在则跳过的逻辑,完全符合你的需求。 - Logstash异步同步
无需修改业务代码,新增Logstash管道,输入端监听person索引的增量数据,过滤端拆分languages数组、做去重处理,输出端写入languages索引即可,优势是无业务侵入,缺点是需要额外维护Logstash组件。 - 自定义Ingest Processor
自行开发Elasticsearch Ingest插件,在自定义Processor中通过内置Client向languages索引发起写入请求,配置person索引的默认Ingest Pipeline为你开发的自定义管道即可,无需修改业务代码,缺点是需要掌握Elasticsearch插件开发能力,版本升级时需要重新适配插件。
方案2:适用于已升级到OpenSearch的场景
直接使用OpenSearch原生提供的Transform API即可,配置一个持续运行的Transform任务:
- 源索引指定为
person - 配置规则先对
languages字段做拆分展开,再按语言值分组去重 - 目标索引指定为
languages
配置完成后Transform任务会自动同步所有新增的person文档中的语言到目标索引,自动去重,是当前场景的最优解,无需额外开发或修改业务逻辑。
内容的提问来源于stack exchange,提问作者DavidEG
相关产品推荐
相关产品推荐

