众所周知,ES 中的 mapping 只能在索引建立初期进行创建,且建立之后不可更改。mapping 对应的字段会映射成指定类型,未定义字段则自动映射,一般为 text 类型。那么想更改索引名或者更改某字段的 mapping 时,是否就束手无策了呢?当然不是!!!官方提供了一个接口,供索引备份迁移操作使用,那便是 reindex。当旧索引与新索引在同一节点时,效率相当高,万条数据瞬间完成(大约只需0.4s
)。数百万数据也只需几分钟即可完成 操作,是不是很溜呢?快来学习一下吧。
更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』
1.索引备份迁移
请求方式:POST
请求 API _reindex
1 | { |
如果新索引中有数据,且 id 与旧索引中重复,那么会进行覆盖操作。
但是当数据量实在太大,高达几十 G 的时候,速度就会变得很慢,那是因为它底层还是利用了 scroll 操作。该如何进行优化呢?可以提升批量操作的文档数大小,如下:
1 | { |
批量操作大小是如何确定的呢?是根据文档数以及文档容量进行确定的。根据查阅资料得知,一个好的起点是每批处理数据 5-15 MB,这是个什么概念?
1000 个 1kb 的文档大约 1MB;1000 个 100kb 的文档是 100MB。
然后逐步增加每批处理数据容量,进行调优,直到最终性能无法再次提升。还有一个方法,那便是提升硬件,比如换固态,你懂得~
还有一种方法提升写入效率,这是终极操作,那便是 sliced
。reindex
支持 Sliced Scroll 操作。它的原理可以简单的理解为将每次的 Scroll 请求分解,分解后并行化请求,从而提升效率。方式为:
1 | POST _reindex?slices=5&refresh |
2.删除索引中指定的数据
请求方式:POST
请求 API _delete_by_query
1 | { |
方法便是先查出指定数据再删除。
3. 设置副本数、分片、动态映射
设置这些指标项可在建立 mapping 时一同设置。
1 | { |