如何使用 Nest 客户端对 UpdateByQuery 或 Reindex 等 Elasticsearch 操作启用自动切片?

How can I enable automatic slicing on Elasticsearch operations like UpdateByQuery or Reindex using the Nest client?

我正在使用 Nest 客户端以编程方式执行针对 Elasticsearch 索引的请求。我需要使用 UpdateByQuery API 来更新索引中的现有数据。为了提高大型数据集的性能,推荐的方法是使用切片。就我而言,我想使用 here.

中记录的自动切片功能

我已经在 Kibana 开发控制台中对此进行了测试,它运行良好。我正在努力研究如何通过 Nest 客户端界面在代码中设置此 属性。这是一个代码片段:

var request = new Nest.UpdateByQueryRequest(indexModel.Name);
request.Conflicts = Elasticsearch.Net.Conflicts.Proceed;
request.Query = filterQuery;

// TODO Need to set slices to auto but the current client doesn't allow it and the server 
// rejects a value of 0
request.Slices = 0;

var elasticResult = await _elasticClient.UpdateByQueryAsync(request, cancellationToken);

关于属性的评论表明它可以设置为“自动”,但它需要很长的时间,所以这是不可能的。

  // Summary:
        //     The number of slices this task should be divided into. Defaults to 1, meaning
        //     the task isn't sliced into subtasks. Can be set to `auto`.
 public long? Slices { get; set; }

设置为 0 只会在服务器上引发错误。有没有其他人尝试这样做?还有其他方法可以配置此行为吗?其他 API 似乎也有同样的问题,比如 ReindexOnServerAsync。

这是规范中的一个错误,也是从规范生成这部分客户端的不幸结果。

The spec has been fixed 并且更改将反映在客户端的未来版本中。不过现在,可以使用以下设置

var request = new Nest.UpdateByQueryRequest(indexModel.Name);
request.Conflicts = Elasticsearch.Net.Conflicts.Proceed;
request.Query = filterQuery;

((IRequest)request).RequestParameters.SetQueryString("slices", "auto");
var elasticResult = await _elasticClient.UpdateByQueryAsync(request, cancellationToken);