49 - ES Update By Query & Reindex API

使用场景

  • 一般在一下几种情况时,我们需要重建索引
    • 索引的Mappings发生变更:字段类型改变,分词器及字典更新
    • 索引的Settings发生变更:索引的主分片数发生改变
    • 集群内,集群间需要做数据迁移
  • Elasticsearch的内置提供的API
    • Update By Query:在现有索引上重建
    • Reindex:在其他索引上重建索引

案例1:为索引增加子字段

  • 改变mapping,增加子字段,使用英文分词器
  • 此时尝试对子字段进行查询
  • 虽然数据已经存在,但是没有返回结果
为索引增加子字段demo

变更前的数据无法查询出来,之后插入的索引可以被查询出来


对索引执行update by query

经此操作之后,mapping变更之前的索引也都可以查询出来了

案例2:更改以后字段类型的Mappings

  • ES不允许在原有Mapping上对字段类型进行修改
  • 只能创建新的索引,并且设定正确的字段类型,再重新导入数据
原来的mapping
执行mapping变更
无法执行变更操作

发现对已存在字段变更mapping无法进行,这里可以采用新建索引,reindex来达成


新建索引,并指定mapping

reindex 并测试

Reindex API

  • Reindex API支持把文档从一个索引拷贝到另外一个索引
  • 使用Reindex API的一些场景
    • 修改索引的主分片数
    • 改变字段的Mapping中的字段类型
    • 集群内数据迁移 / 跨集群的数据迁移
  • 使用注意:
    • 索引的_source处理enable状态
    • 需提前创建好索引,以及指定好mapping以及setting

OP Type

  • 使用op_type为create,reindex只会创建目标索引中不存在的文档
  • 文档如果已经存在,会导致版本冲突
op_type create

跨集群ReIndex

reindex.remote.whitelist:"otherhost:9200,another:9200"
  • 需修改elasticsearch.yml 并重启节点


    reindex跨集群

查看Task API

  • reindex api支持异步操作,执行只返回TaskId
  • POST _reindex?wait_for_completion=false
GET _tasks?detailed=true&actions=reindex

你可能感兴趣的:(49 - ES Update By Query & Reindex API)