前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解决 Elasticsearch type 不一致导致写入数据失败

解决 Elasticsearch type 不一致导致写入数据失败

作者头像
Jared.Tan
发布2020-06-19 15:32:01
1.5K0
发布2020-06-19 15:32:01
举报
文章被收录于专栏:云原生可观测性

在 Elasticsearch 7.x 以前的版本中,当ES Client写数据的时候报了如下错误:

2020-03-13 10:00:41.076 ERROR 9 --- [Report ES Thread 0] .g.c.c.AbstractElasticsearchReportClient : item: 2634ef87-ec48-4d38-899f-508ba8b69b9c, errorReason: Rejecting mapping update to [journal_test] as the final mapping would have more than 1 type: [default, doc]

意思就是说你写入的数据的中的type 与你创建索引时指定type不一致。比如我创建时 "_type":"_doc",而写入时为 "_type":"default"。因此,有两种办法,要么修改写入数据时的 type ,要么修改当前索引的 type 。

不过在最新的 7.x 没有该问题了,因为 官方已经把 type 功能移除了。

考虑到更改写入时候的 type 就得重启应用,会影响用户使用。所以这里采用修改当前索引的方法。

提供一种最简单的解决思路:通过 Elasticsearch 的 reindex 功能将当前索引 journal_test 备份至 journal_test_back 索引并删除 journal_test,让 ES 根据写入数据时自动生成 type 为 default 的索引。随后将备份数据导出到文件,修改文件中 type 为 default。再写入原来新的 journal_test_2 索引。

将 journal_test_2 索引数据备份至 journal_test_2_bak索引:

代码语言:javascript
复制
curl -X POST "localhost:9200/_reindex?pretty" -H 'Content-Type: application/json' -d'
{
  "source": {
    "index": "journal_test"
  },
  "dest": {
    "index": "journal_test_back"
  }
}
'

删除 journal_test 索引,让你的应用再次写入数据时 ES 自己创建索引:

代码语言:javascript
复制
curl -X DELETE "http://localhost:9200/journal_test"

journal_test_back 数据导出到 my_index_mapping.json 文件中

这里借助工具:https://github.com/taskrabbit/elasticsearch-dump,将 备份数据导出到我本地 Desktop 目录下:

代码语言:javascript
复制
docker run --rm -ti -v ~/Desktop:/tmp taskrabbit/elasticsearch-dump \
 --input=http://localhost:9200/journal_test_back \
 --output=/tmp/my_index_mapping.json \
 --type=data

编辑 my_index_mapping.json 文件,将 type 修改为 default。注意,为了不影响原来的备份数据,我将修改后的数据写入到新的文件(my_index_mapping_default.json)中:

代码语言:javascript
复制
cat my_index_mapping.json| sed s/\"_type\":\"doc\"/\"_type\":\"default\"/ > my_index_mapping_default.json

最后一步,将正确的数据导入正确的 journal_test 索引中:

代码语言:javascript
复制
docker run --rm -ti -v ~/Desktop:/tmp taskrabbit/elasticsearch-dump \
 --output=http://localhost:9200/journal_test \ # 注意索引名
 --input=/tmp/my_index_mapping_default.json \ #注意这里使用的文件
 --type=data

总结

这里提供了最简单的一种解决办法,当然还可以利用 Elastisearch 的 script 功能直接进行转化。如果你有更多方法,留言吧~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一万小时极客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 将 journal_test_2 索引数据备份至 journal_test_2_bak索引:
  • 删除 journal_test 索引,让你的应用再次写入数据时 ES 自己创建索引:
  • 将 journal_test_back 数据导出到 my_index_mapping.json 文件中
  • 最后一步,将正确的数据导入正确的 journal_test 索引中:
  • 总结
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档