公司有一个场景是每天需要批量导入大量数据到es中(我们用的是datax),并且字段是动态mapping的,字段越来越多之后终于遇到了这个报错。
java.lang.IllegalArgumentException: Limit of total fields [1000] in index xxx
简单搜了下其实这是es的默认值,单个索引最大的字段数是1000,超过就报错,写不进去了。
解决方法也很简单,把这个1000改大就可以了,很多文档会让你这样改
PUT my_index/_settings
{
"index.mapping.total_fields.limit": 2000
}
没有kibina的话可以用shell curl
curl --user admin:admin --header "Content-Type: application/json;charset=UTF-8" -XPUT http://127.0.0.1:9200/my_index/_settings -d '{"index.mapping.total_fields.limit": 2000}'
改完之后用get查一下,果然是2000了,这下应该没问题了吧,重跑了一下,又出错了,还是一样的错,再get一下看看配置,变回1000了,什么鬼。
1.导入的是大量数据
2.每天都导
3.用的dataX
翻了一下配置文件发现一个配置
"cleanup": true
意思是每次导入都重建索引,重建意思是旧索引删除了,重新建一个新的。到这里问题出来了,上面改成2000的索引被删掉了,新建索引又是1000的默认值。
重新启动任务,等索引建好了再改成2000,这次成功同步完了,完美。好像又有点不对劲,下一次再同步的时候不是又变成1000了,怎么办。
能不能把这个2000在创建索引的时候就设置好呢?
又翻了下dataX的文档,在示例配置中发现了一个settings的字段,看起来像是可以设置索引的属性,试一下。
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0,
"index.mapping.total_fields.limit":"2000"
}
成功了,这下完美了。
问题其实很简单,但是不注意会掉坑里,如果用datax的话为了彻底解决问题,total_fields的配置要写到datax同步的配置文件中,不然下次还报错。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有