如何通过Nest客户端为Elasticsearch的UpdateByQuery等操作开启自动切片
解决方案
你可以通过以下两种方式实现自动切片配置,两种方案均兼容UpdateByQuery、ReindexOnServer等所有存在相同属性限制的API:
方案1:添加自定义查询参数(推荐)
Nest客户端所有请求均支持手动追加查询字符串参数,该参数优先级高于请求体内序列化的字段值,可以直接覆盖slices的取值:
var request = new Nest.UpdateByQueryRequest(indexModel.Name); request.Conflicts = Elasticsearch.Net.Conflicts.Proceed; request.Query = filterQuery; // 无需给Slices属性赋值,通过查询参数直接传入auto即可 var elasticResult = await _elasticClient.UpdateByQueryAsync(request, configure => configure.RequestParameters.AddQueryString("slices", "auto"), cancellationToken);
方案2:手动传入分片数实现等效效果
ES官方的auto切片逻辑本质就是自动取目标索引的主分片数量作为切片数,你可以提前读取索引配置获取主分片数后赋值给Slices属性,效果和传入auto完全一致:
// 获取目标索引的主分片配置 var indexSettings = await _elasticClient.Indices.GetSettingsAsync(indexModel.Name); var primaryShardCount = indexSettings.Indices[indexModel.Name].Settings.NumberOfShards; var request = new Nest.UpdateByQueryRequest(indexModel.Name); request.Conflicts = Elasticsearch.Net.Conflicts.Proceed; request.Query = filterQuery; request.Slices = primaryShardCount; var elasticResult = await _elasticClient.UpdateByQueryAsync(request, cancellationToken);
如果是跨多个索引执行操作,取所有涉及索引的主分片数总和作为切片数即可。
内容的提问来源于stack exchange,提问作者BenR
相关产品推荐
相关产品推荐

