本文使用 ElasticSearch-head插件

下文简称:A源索引      B新索引      C最终索引

  1. 创建新索引B:分片数默认5,副本数设置为0,写入更快

  2. 设置索引B的映射:最终想要的mapping字段结构

    POST 索引B/type名/_mapping
    {
      "properties": {
        "log_request_body": {
          "type": "text",
          "fields": {
            "keyword": {
              "ignore_above": 256,
              "type": "keyword"
            }
          }
        },
        {更多字段....}
      }
    }

     

  3. 设置索引B不自动刷新,写入更快

    PUT 索引B/_settings
    {
      "index": {
        "refresh_interval": "-1"
      }
    }

  4. 设置索引B不动态添加mapping,否则会自动创建旧索引mapping,那不前功尽弃了

    dynamic策略

    true:默认值,遇到陌生字段,就动态添加

    false:遇到陌生字段,就忽略

    strict:遇到陌生字段,就报错

    PUT 索引B/type名/_mapping
    {
      "dynamic": "false"
    }

  5. 数据拷贝:A到B  wait_for_completion=false不等待直接返回taskid,任务后台执行

    "size": 5000,以5000个doc为一组进行复制

    POST _reindex?wait_for_completion=false
    {
      "source": {
        "index": "log_statistics",
        "size": 5000
      },
      "dest": {
        "index": "log_statistics_new3"
      }
    }

  6. 查看task进度 或 取消task

    GET _tasks?detailed=true&actions=*reindex

  7. 等待复制完成后,删除索引A,释放磁盘空间

     shell命令:

    curl -XPOST 'http://localhost:9200/源索引A/_forcemerge?only_expunge_deletes=true'
    curl -XDELETE localhost:9200/源索引A
  8. 重建与A相同名字的索引C,分片数默认5,副本数设置为0,写入更快

  9. 设置索引C不自动刷新,写入更快

  10. 数据拷贝:B到C  wait_for_completion=false不等待,返回taskid,后台执行

  11. 查看task进度

  12. 删除索引B,释放磁盘空间

  13. 最终索引C修改回默认设置:自动刷新,动态添加mapping,副本数设置为1

    步骤3值改为1s,步骤4值改为true,各执行一次,下面的是设置副本数:
    PUT 索引C/_settings
    {
      "number_of_replicas": 1
    }

最后总结:

es并不能直接删除mapping中的字段,只能建一个过度索引,复制数据后再建一个与最开始同名的索引,这样不影响原有代码查询。通过设置别名,会影响代码删除doc。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐