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