一、使用场景

1.分片数变更:当你的数据量过大,而你的索引最初创建的分片数量不足,导致数据入库较慢的情况,此时需要扩大分片的数量,此时可以尝试使用Reindex。
2. mapping字段变更:当数据的mapping需要修改,但是大量的数据已经导入到索引中了,重新导入数据到新的索引太耗时;但是在ES中,一个字段的mapping在定义并且导入数据之后是不能再修改的,所以这种情况下也可以考虑尝试使用Reindex。
3. 分词规则修改,比如使用了新的分词器或者对分词器自定义词库进行了扩展,而之前保存的数据都是按照旧的分词规则保存的,这时候必须进行索引重建。


二、_reindex

官方说明地址:reindex

ES提供了_reindex这个API。相比于我们重新导入数据肯定会快不少,实测速度大概是bulk导入数据的5-10倍。
reindex的核心做跨索引、跨集群的数据迁移。

Reindex 不会尝试设置目标索引。 它不会复制源索引的设置。 您应该在运行 _reindex 操作之前设置目标索引,包括设置映射、分片计数、副本等。

先根据复制源索引创建新的目标索引,然后执行reindex命令。
基础使用命令:

POST _reindex
{"source": {"index": "old_index"},"dest": {"index": "new_index"}
}

三、实战

1、覆盖更新

说明:
"version_type": "internal",internal表示内部的,省略version_type或version_type设置为 internal 将导致 Elasticsearch 盲目地将文档转储到目标中,覆盖任何具有相同类型和 ID 的文件。
这也是最常见的重建方式。

POST _reindex
{"source": {"index": "twitter"},"dest": {"index": "new_twitter","version_type": "internal"}
}

2、创建丢失的文档并更新旧版本的文档

说明:
"version_type": "external",external表示外部的,将 version_type 设置为 external 将导致 Elasticsearch 保留源中的版本,创建任何丢失的文档,并更新目标索引中版本比源索引中版本旧的任何文档。
id不存在的文档会直接更新;id存在的文档会先判断版本号,只会更新版本号旧的文档。

POST _reindex
{"source": {"index": "twitter"},"dest": {"index": "new_twitter","version_type": "external"}
}

3、仅创建丢失的文档

要创建的 op_type 设置将导致 _reindex 仅在目标索引中创建丢失的文档,所有存在的文档都会引起版本冲突。
只要两个索引中存在id相同的记录,就会引起版本冲突

POST _reindex
{"source": {"index": "twitter"},"dest": {"index": "new_twitter","op_type": "create"}
}

4、冲突处理

默认情况下,版本冲突会中止 _reindex 进程。 “冲突”请求正文参数可用于指示 _reindex 继续处理有关版本冲突的下一个文档。 需要注意的是,其他错误类型的处理不受“冲突”参数的影响。
"conflicts": "proceed"在请求正文中设置时,_reindex 进程将继续处理版本冲突并返回遇到的版本冲突计数。

POST _reindex
{"conflicts": "proceed","source": {"index": "twitter"},"dest": {"index": "new_twitter","op_type": "create"}
}

5、source中添加查询条件

POST _reindex
{"source": {"index": "twitter","query": {"term": {"user": "kimchy"}}},"dest": {"index": "new_twitter"}
}

6、source中包含多个源索引

源中的索引可以是一个列表,允许您在一个请求中从多个源中复制。 这将从 twitter 和 blog 索引中复制文档:

POST _reindex
{"source": {"index": ["twitter", "blog"]},"dest": {"index": "all_together"}
}

也支持*号来匹配多个索引。

POST _reindex
{"source": {"index": "twitter*"},"dest": {"index": "all_together"}
}

7、限制处理的记录数

通过设置size大小来限制处理文档的数量。

POST _reindex
{"size": 10000,"source": {"index": "twitter","sort": { "date": "desc" }},"dest": {"index": "new_twitter"}
}

8、从远程ES集群中重建索引

POST _reindex
{"source": {"remote": {"host": "http://otherhost:9200","username": "user","password": "pass","socket_timeout": "1m","connect_timeout": "10s"},"index": "source","query": {"match": {"test": "data"}}},"dest": {"index": "dest"}
}

9、提取随机子集

说明:从源索引中随机取10条数据到新索引中。

POST _reindex
{"size": 10,"source": {"index": "twitter","query": {"function_score" : {"query" : { "match_all": {} },"random_score" : {}}},"sort": "_score"    },"dest": {"index": "random_twitter"}
}

10、修改字段名称

原索引

POST test/_doc/1?refresh
{"text": "words words","flag": "foo"
}

重建索引,将原索引中的flag字段重命名为tag字段。

POST _reindex
{"source": {"index": "test"},"dest": {"index": "test2"},"script": {"source": "ctx._source.tag = ctx._source.remove(\"flag\")"}
}

结果:

GET test2/_doc/1
{"found": true,"_id": "1","_index": "test2","_type": "_doc","_version": 1,"_seq_no": 44,"_primary_term": 1,"_source": {"text": "words words","tag": "foo"}
}

四、性能优化

常规的如果我们只是进行少量的数据迁移利用普通的reindex就可以很好的达到要求,但是当我们发现我们需要迁移的数据量过大时,我们会发现reindex的速度会变得很慢。
数据量几十个G的场景下,elasticsearch reindex速度太慢,从旧索引导数据到新索引,当前最佳方案是什么?
原因分析:
reindex的核心做跨索引、跨集群的数据迁移。
慢的原因及优化思路无非包括:
1)批量大小值可能太小。需要结合堆内存、线程池调整大小;
2)reindex的底层是scroll实现,借助scroll并行优化方式,提升效率;
3)跨索引、跨集群的核心是写入数据,考虑写入优化角度提升效率。
可行方案:
1)提升批量写入的大小值size
2)通过设置sliced提高写入的并行度

1、提升批量写入大小值

默认情况下 _reindex 使用 1000 的滚动批次。可以使用源元素source中的 size 字段更改批次大小:

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

2、提高scroll的并行度

Reindex 支持 Sliced Scroll 来并行化重新索引过程。 这种并行化可以提高效率并提供一种将请求分解为更小的部分的便捷方式。
每个Scroll请求,可以分成多个Slice请求,可以理解为切片,各Slice独立并行,利用Scroll重建或者遍历要快很多倍。
slicing的设定分为两种方式:手动设置分片、自动设置分片。

自动设置分片如下:

POST _reindex?slices=5&refresh
{"source": {"index": "twitter"},"dest": {"index": "new_twitter"}
}

slices大小设置注意事项:
1)slices大小的设置可以手动指定,或者设置slices设置为auto,auto的含义是:针对单索引,slices大小=分片数;针对多索引,slices=分片的最小值。
2)当slices的数量等于索引中的分片数量时,查询性能最高效。slices大小大于分片数,非但不会提升效率,反而会增加开销。
3)如果这个slices数字很大(例如500),建议选择一个较低的数字,因为过大的slices 会影响性能。
效果
实践证明,比默认设置reindex速度能提升10倍+。

五、超时问题

es中的请求超时时间默认是1分钟,当重建索引的数据量太大时,经常会出现超时。这种情况可以增大超时时间,也可以添加wait_for_completion=false参数将请求转为异步任务。

POST _reindex?slices=9&refresh&wait_for_completion=false
{"source": {"index": "twitter"},"dest": {"index": "new_twitter"}
}

1、获取reindex任务列表

GET _tasks?detailed=true&actions=*reindex

2、根据任务id查看任务

GET /_tasks/r1A2WoRbTwKZ516z6NEs5A:36619

3、取消任务

POST _tasks/r1A2WoRbTwKZ516z6NEs5A:36619/_cancel

总结

本文主要介绍了ES索引重建的常见使用场景以及典型的使用方法,并说明了相关性能优化的技巧和请求超时问题的处理方法。

ES索引重建reindex详解相关推荐

  1. android平台下OpenGL ES 3.0实例详解顶点属性、顶点数组

    OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘 ...

  2. ORACLE的索引和约束详解数据库

    ORACLE的索引和约束详解数据库 Oracle的约束 * 如果某个约束只作用于单独的字段,即可以在字段级定义约束,也可以在表级定义约束,但如果某个约束作用于多个字段, 必须在表级定义约束 * 在定义 ...

  3. 西门子触摸屏HMI变量的指针化索引应用示例详解

    西门子触摸屏HMI变量的指针化索引应用示例详解 在实际HMI组态项目时,若有多台相同的设备的参数需要查看或显示时,可以使用变量的指针化索引功能来实现,优点是减少画面上IO域的数量,显示画面更简洁,具体 ...

  4. elasticsearch 索引存储深入详解(Elasticsearch教程03)|MVP讲堂

    作者:阿里云MVP 铭毅 往期内容: 死磕 Elasticsearch 方法论:普通程序员高效精进的 10 大狠招! Elasticsearch学习,请先看这一篇!(Elasticsearch教程01 ...

  5. ES倒排索引与分词详解

    倒排索引 正排索引:文档id到单词的关联关系 倒排索引:单词到文档id的关联关系 示例: 对以下三个文档去除停用词后构造倒排索引 image 倒排索引-查询过程 查询包含"搜索引擎" ...

  6. MySQL索引-视频+图文详解

    MySQL索引与二分查找法 DB哥MySQL高级教程-系统学习MySQL共149课时 加我微信公众号免费学:DB哥 文末有MySQL高级课程目录 前言 因为现在使用的mysql默认存储引擎是Innod ...

  7. MySQL索引及使用详解

    一.索引的作用 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重. 在数据 ...

  8. elasticsearch 索引存储深入详解

    1.关于ES index存储在内存的问题? (1)早期ES1.X版本对ES索引存储介绍: 原文地址:  https://www.elastic.co/guide/en/elasticsearch/re ...

  9. ES的mapping配置详解

    mapping 类似于数据库的schema的定义,mapping会把文档映射成lucene需要的扁平格式,一个mapping属于一个索引的type,一个type中有一个mapping定义,7.0后一个 ...

  10. ORACLE的索引和约束详解

    Oracle的约束 * 如果某个约束只作用于单独的字段,即可以在字段级定义约束,也可以在表级定义约束,但如果某个约束作用于多个字段, 必须在表级定义约束 * 在定义约束时可以通过CONSTRAINT关 ...

最新文章

  1. Docker:搭建RabbitMQ集群
  2. Redis进阶 - Redis主从工作原理详解
  3. 【Leetcode】刷题题单记录
  4. 不小心删除了某个包的一部分,重新安装方法
  5. Qt Designer的信号和插槽编辑模式
  6. 双十一变身大型奥数竞赛现场?数学不好的你请转场
  7. Onvif2.6.1命名空间前缀对照
  8. python模式匹配算法_详解Python 最短匹配模式
  9. Python实例讲解 -- 发送邮件带附件 (亲测)
  10. 编程语言对比 条件控制语句
  11. 深入学习typedef和typename
  12. php 星号邮箱,PHP以星号隐藏用户名手机号码和邮箱实例
  13. mysql基本sql语句总结(二)
  14. selenium获取文本的几种方法小结(获取源码)
  15. 单机游戏合集!12000G!淘宝购!
  16. python基本函数的导数公式_算法中的微积分:5大函数求导公式让你在面试中脱颖而出...
  17. codewars 7×7 Skyscrapers 问题解决
  18. linux添加一块20G的scsi硬盘,Linux下添加第二块scsi硬盘.doc
  19. hdu5285-wyh2000 and pupil-(染色法二分图判定)
  20. Python Pexpect库的简单使用

热门文章

  1. Kettle/Pentaho的安装与配置
  2. Linux怎么恢复已删除的文件,Linux中使用extundelete恢复已删除的文件
  3. 斜线“\”与反斜线“/”应用场景的整理(转)
  4. 侏罗纪开发实施工作管理平台
  5. 【JIRA学习】 研发项目管理工具工时管理-插件Tempo
  6. 托福听力速记符号单词表
  7. 机器人领域SCI期刊总结
  8. android textview左边图片,Android TextView 多种方式显示图片-Fun言
  9. IC学习笔记9——多比特信号的跨时钟域处理方法之“MUX/DMUX同步器”
  10. ajax请求接口连不上会报错吗_本地ajax请求服务器