ElasticSearch新增IK扩展词后,让历史数据生效方法
问题描述 IK是ES的中文分词插件。在IK新增热词后,不会去更新历史数据,即新添加的热词只对后续的数据生效。而实际上我们常常需要对历史数据进行更新。
解决办法 使用ES自己提供的update_by_query接口。
- 调用接口:http://127.0.0.1:9200/index*/_update_by_query?conflicts=proceed
- 可以指定多个索引多个type。
http://127.0.0.1:9200/index1,index2/type1,type2/_update_by_query?conflicts=proceed - 可以使用通配符*,匹配多个索引
-返回结果示例
- 可以指定多个索引多个type。
{
"took": 49616, // 话费时间
"timed_out": false,//是否超时
"total": 123649,//数据总数
"updated": 123649,//更新总数
"deleted": 0,
"batches": 124,//scroll响应数量
"version_conflicts": 0,//版本冲突数量
"noops": 0,
"retries": {
"bulk": 0,
"search": 0
},
"throttled_millis": 0,
"requests_per_second": -1,
"throttled_until_millis": 0,
"failures": []
}
- 默认批处理的大小是1000,参数设置如下:
- 其他支持的参数
refresh, wait_for_completion, wait_for_active_shards, and timeout.
- 查询update_by_query:http://10.120.241.194:9200/_tasks?detailed=true&actions=*byquery
- 取消upate_by_query任务:http://10.120.241.194:9200/_tasks/BmK-50kZQCuFwvObmFrLrw:27388/_cancel。
update_by_query原理 【ElasticSearch新增IK扩展词后,让历史数据生效方法】开始时获取一个索引的快照,并且使用内部版本来号来进行更新。这意味着如果文档在获得快照后,对索引处理 过程中版本发生更改,将会发生版本冲突。当快照的版本和索引版本一直时则进行更新,并且递增文档版本号。
当遇到冲突而导致整个更新过程失败时,更新过程是不会回滚的。如果不想因为冲突导致整个更新过程终止,可以在url中添加参数conflicts=proceed。或者在请求body中添加”conflicts”:”proceed”
效率测试 更新测试环境所有索引(14个),文档数量123649,耗时49616,效率2490个/s。观察服务器负载在2左右。
测试环境es为单个节点。
总体上对性能影响不大。
注意点
- 新增IK热词后,需要等热词生效后才能掉该接口。可以使用分词分析接口来确认。
http://10.120.241.194:9200/indexname/_analyze?text=银天下&tokenizer=ik_max_word
该接口返回有对应分词即表示添加成功。
推荐阅读
- Unity和Android通信系列文章2——扩展UnityPlayerActivity
- Excel|Excel 2013 新增功能之瞬间填充整列数据!
- ElasticSearch6.6.0强大的JAVA|ElasticSearch6.6.0强大的JAVA API详解
- Elasticsearch|Elasticsearch 简介
- 12.新增腾讯的统计(以渠道来源说明)
- HTML5新增选择器属性方法
- PHP|PHP 扩展开发检测清单(扩展开发必读)
- elasticsearch分析器
- 三十一、|三十一、 Elasticsearch集群搭建部署及配置
- springmvc|springmvc 集成 Spring Data Elasticsearch 遇到的坑