《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.12.Reindex API(4) https://developer.aliyun.com/article/1230244
自动切片
还可以使用 Sliced scroll 基于文档 _id进行切片,让 _reindex自动并行化;通过设定 slices 参数的值来实现。
示例如下:
POST _reindex?slices=5&refresh { "source": { "index": "my-index-000001" }, "dest": { "index": "my-new-index-000001" } }
可以通过以下方式验证此功能:
POST my-new-index-000001/_search?size=0&filter_path=hits.total
返回结果如下:
{ "hits": { "total" : { "value": 120, "relation": "eq" } } }
设置slices为auto会让Elasticsearch选择要使用的切片数。此设置将每个分片使用一个切片,直到达到某个限制。如果有多个源,它将基于分片数量最少的索引或 Backing index 确定切片数。
POST _reindex?slices=auto&refresh { "source": { "index": "my-index-000001" }, "dest": { "index": "my-new-index-000001" } } # 由源码可知,slices 实际被修改为0 if (slicesString.equals(AbstractBulkByScrollRequest.AUTO_SLICES_VALUE)) { return AbstractBulkByScrollRequest.AUTO_SLICES; } public static final int AUTO_SLICES = 0; public static final String AUTO_SLICES_VALUE = "auto";
_reindex 中添加 slices,将会自动完成上面手动切片创建的请求;自动切片创建的子请求有些不一样的特征:
1、你可以使用 Tasks APIs 查看这些子请求,这些子请求是带有slices请求任务的“子”任务。
2、获取带有参数slices请求的任务状态,将只返回包含已完成切片的状态。
3、可以分别对这些子请求,进行任务取消或者重新调节限速 。
4、重新调速带有slices参数的请求,将会按比例调速它的子任务。
5、取消带有slices参数的请求,将会取消它的所有子任务。
6、由于切片的性质,可能会每个切片的文档并不均匀,会出现某些切片某些切片可能比其他切片大;但是所有文档都会被划分到某个切片中。
7、slices 请求如果含有requests_per_second和max_docs,将会按比例分配给每个子请求。结合上面关于分布不均匀的观点,将max_docs与切片一起使用可能会出现满足条件的max_docs文档不被重新索引。
8、尽管这些快照几乎都是在同一时间获取,但是每个子请求,可能获取的源快照会有稍微的不同。
合理选择切片数目
自动切片,设置slices为auto,将为大多数索引选择一个合理切片数目。如果手动切片或以其他方式调整自动切片,应当明白以下几个点:
1、当slices的数目等于索引的主分片数时,查询性能是最优的。设置 slices的数目大于主分片数通常不会提高效率,反而会增加开销(CPU,磁盘 IO 等)。
2、索引性能会在可用资源与切片数之间线性地缩放。
3、查询或索引性能在运行时是否占主导地位,取决于重新索引的文档和集群资源。
重新索引的路由
默认情况下,如果_reindex看到一个带有路由的文档,则路由将被保留,除非它被脚本更改。可以在dest的 JSON 体内上重新设置routing,从而改变之前的路由值,routing的可取值如下:
keep
keep为默认值,将为每个匹配项发送的批量请求的路由,设置为匹配项旧的路由(就保持旧的路由方式)。
discard
将发送的批量请求的路由设置为null
=
将发送的批量请求的路由设置为=之后的值
示例,使用以下请求将source_index中公司名称为cat的所有文档复制到source_index且路由设置为cat:
POST _reindex { "source": { "index": "source_index", "query": { "match": { "company": "cat" } } }, "dest": { "index": "dest_index", "routing": "=cat" } }
默认情况下,_reindex使用滚动批处理1000。您可以使用元素中的size字段更改批处理大小:
POST _reindex { "source": { "index": "source_index", "size": 100 }, "dest": { "index": "dest_index", "routing": "=cat" } }
重索引使用预处理 Pipeline
重索引也可以使用ingest pipeline的特性,来富化数据;示列如下:
POST _reindex { "source": { "index": "source" }, "dest": { "index": "dest", "pipeline": "some_ingest_pipeline" #提前定义的 pipeline } }
实战示例
基于查询重新索引文档
可以通过在source中添加查询条件,对有需要的文档进行重新索引;
例如,复制user.id值为kimchy文档到my-new-index-000001:
POST _reindex { "source": { "index": "my-index-000001", "query": { "term": { "user.id": "kimchy" } } }, "dest": { "index": "my-new-index-000001" } } 基于 max_docs 重新索引文档 通过在请求体中设置max_docs参数,控制重建索引的文档的个数。 例如:从my-index-000001复制一个文档到my-new-index-000001: POST _reindex { "max_docs": 1, "source": { "index": "my-index-000001" }, "dest": { "index": "my-new-index-000001" } }
《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.12.Reindex API(6) https://developer.aliyun.com/article/1230241