Как я могу включить автоматическое срезание для операций Elasticsearch, таких как запрос обновления или переиндексация, с помощью клиента Nest?

#elasticsearch #nest

Вопрос:

Я использую клиент Nest для программного выполнения запросов по индексу Elasticsearch. Мне нужно использовать API UpdateByQuery для обновления существующих данных в моем индексе. Для повышения производительности при работе с большими наборами данных рекомендуется использовать срезание. В моем случае я хотел бы использовать функцию автоматического нарезания, описанную здесь.

Я протестировал это в консоли разработчика 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, похоже, сталкиваются с той же проблемой, например, с переиндексацией сервера синхронизации.

Ответ №1:

Это была ошибка в спецификации и неудачное следствие создания этой части клиента из спецификации.

Спецификация была исправлена, и изменения будут отражены в будущей версии клиента. На данный момент, однако, его можно настроить следующим образом

 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);