ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ElasticSearch如何修改索引字段

2020-12-16 10:30:49  阅读:348  来源: 互联网

标签:index reindex 修改 shelf idt 索引 ElasticSearch 2265


一、需求

当es字段类型无法支撑业务需求,需要修改到字段类型的时候。例如修改字段类型从Integer变成double,这种情况下,是没办法修改es的字段的type的。

原因是一个字段的类型进行修改之后,ES会重新建立对这个字段的索引信息,ElasticsSearch的底层是Lucene库,字段类型修改会涉及到分词方式,相关度,TF/IDF等倒排的生成 , 所以是没办法修改的了。

这种情况下,如何能兼容旧数据的同时,实现修改字段类型?

二、如何实现:es的reindex

实现原理:通过es的reindex功能把旧索引的数据reindex到新索引,然后为新索引建立旧索引的别名,最后删除旧索引。

下面以重构:idt-shelf-2265-index-202003 下的 shelf_sub_job 中的Integer字段变为double为例子

  1. 新建一个索引:idt-shelf-2265-index-202003-temp (注:该索引下的数据表type和原索引保持一致。其中,新索引中的字段属性已修改为double)
    *可通过EsIndexService类创建一个新的索引。
     
  2. 执行reindex操作,把旧索引的数据复制到新索引:
    POST _reindex                    
    {
      "source": {
        "index": "idt-shelf-2265-index-202003"
      },
      "dest": {
        "index": "idt-shelf-2265-index-202003-temp"
      }
    }
    执行该操作后,可以在kibana上面查看进度:
     
  3. 删除旧索引:
    DELETE idt-shelf-2265-index-202003
     
     
  4. 修改新索引的别名为“idt-shelf-2265-index-202003”:
      POST /_aliases
      {
            "actions": [
                {"add": {"index": "idt-shelf-2265-index-202003-temp", "alias":idt-shelf-2265-index-202003"}}
            ]
      }

三、查询reIndex进度、终止reIndex

  • 查询reIndex进度

    GET _tasks?detailed=true&actions=*reindex

  • 取消reIndex任务

    POST _tasks/node_id:task_id/_cancel

 

四、提升reIndex速度

从第二步能看出,reindex速度非常慢,每秒只有200条数据。

提升reindex的几个点:

(1)修改批量大小值

默认情况下,_reindex使用1000进行批量操作,您可以在source中调整batch_size

POST _reindex
{
"source": {
"index": "source",
"size": 5000
},
"dest": {
"index": "dest",
"routing": "=cat"
}
}

(2)ES副本数设置为0

我们看下一个文档被创建的流程:

一个创建请求,在主分片创建了文档后,会转发请求到副本所在到节点,待副本创建成功后,才返回给客户端。

所以在reindx的时候,提升速度,可以考虑把副本数设置为0,待reindex成功后,再设置为1,es会自动建立副本。

PUT /idt-shelf-2265-index-202003-temp/_settings
{
         "number_of_replicas": 0
}

如下效果,副本数设置为0后,主分片的速率得到了很大的提升。

(reindex完毕后,要记得设置副本数~)

 

 

(3)修改Refresh的间隔时间 

如果你的搜索结果不需要近实时的准确度,考虑把每个索引的 index.refresh_interval改到 30s 。如果你是在做大批量导入,导入期间你可以通过设置这个值为 -1 关掉刷新。别忘记在完工的时候重新开启它。

PUT /idt-shelf-2265-index-202003-temp/_settings
{

"refresh_interval": -1

}

如下效果图,我把刷新时间设置为120s比30s效果要好,但设置为关闭刷新,反而效果变差了??

 

 

五、安全考虑

1、进行以上操作的时候,建议先对索引建立快照备份。

2、reindex操作前考虑清楚,一来太耗时了,二来reindex过程中,原索引新增的数据,是没有被reindex过去,看看reindex的原理就是明白,用的是scroller

标签:index,reindex,修改,shelf,idt,索引,ElasticSearch,2265
来源: https://blog.csdn.net/nddjava/article/details/111246961

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有