Elasticsearch 2.1: окно результатов слишком велико (индекс.максимальное окно результата)



мы извлекаем информацию из Elasticsearch 2.1 и разрешаем пользователю просматривать результаты. Когда пользователь запрашивает высокий номер страницы, мы получаем следующее сообщение об ошибке:




окно результата слишком большое, От + размер должен быть меньше или равен
к: [10000], но [10020]. См. API прокрутки для более эффективного
способ запроса больших наборов данных. Этот предел может быть установлен путем изменения
[индекс.max_result_window] уровень индекса параметр




в elastic docu говорится, что это связано с высоким потреблением памяти и использованием API прокрутки:




ценности выше, чем может потреблять значительные куски памяти в
поиск и за осколок, выполняющий поиск. Безопаснее всего оставить это
значение как это использовать scroll api для любой глубокой прокрутки https://www.elastic.co/guide/en/elasticsearch/reference/2.x/breaking_21_search_changes.html#_from_size_limits




дело в том, что я не хочу получать большие наборы данных. Я только хочу получить срез из набора данных, который находится очень высоко в результирующем наборе. Также прокрутка docu говорит:




прокрутка не предназначена для запросов пользователей в реальном времени https://www.elastic.co/guide/en/elasticsearch/reference/2.2/search-request-scroll.html




Это оставляет меня несколько вопросов:



1) Действительно ли потребление памяти будет ниже (если да, то почему), если я использую scrolling api для прокрутки до результата 10020 (и игнорирую все ниже 10000) вместо выполнения "обычного" поискового запроса для результата 10000-10020?



2) это не кажется, что прокрутка API является вариантом для меня, но что я должен увеличить "индекс.max_result_window". У кого-нибудь есть опыт с этим?



3) Есть ли другие варианты решения моей проблемы?

774   6  

6 ответов:

Если вам нужна большая глубокая разбивка на страницы, я думаю, что только один вариант решения-увеличить значение max_result_window

curl -XPUT "http://localhost:9200/my_index/_settings" -d '{ "index" : { "max_result_window" : 500000 } }'

увеличение использования памяти, я не найден для значений ~ 100k

следующие страницы в эластичной документации говорят о глубокой подкачке:

https://www.elastic.co/guide/en/elasticsearch/guide/current/pagination.html https://www.elastic.co/guide/en/elasticsearch/guide/current/_fetch_phase.html

в зависимости от размера ваших документов, количества осколков и оборудование, которое вы используете, вызывает от 10 000 до 50 000 результатов (от 1000 до 5000 страниц) глубокий должен быть идеально выполнимый. Но с большой-достаточно от значения, сортируя процесс могут стать очень тяжелыми действительно, используя обширное объем процессора, памяти и пропускной способности. По этой причине, мы настоятельно советую не углубляться в пейджинг.

правильным решением было бы использовать прокрутку.
Однако, если вы хотите расширить результаты search возвращает более 10 000 результатов, вы можете сделать это легко с Kibana:

на Dev Tools и просто отправьте следующее в свой индекс (your_index_name), указав, каким будет новое окно max result

enter image description here

PUT your_index_name/_settings
{ 
  "max_result_window" : 500000 
}

если все идет хорошо, вы должны увидеть следующий ответ успеха:

{
  "acknowledged": true
}

используйте Scroll API, чтобы получить более 10000 результатов.

прокрутите пример в Elasticsearch NEST API

я использовал его так:

private static Customer[] GetCustomers(IElasticClient elasticClient)
{
    var customers = new List<Customer>();
    var searchResult = elasticClient.Search<Customer>(s => s.Index(IndexAlias.ForCustomers())
                          .Size(10000).SearchType(SearchType.Scan).Scroll("1m"));

    do
    {
        var result = searchResult;
        searchResult = elasticClient.Scroll<Customer>("1m", result.ScrollId);
        customers.AddRange(searchResult.Documents);
    } while (searchResult.IsValid && searchResult.Documents.Any());

    return customers.ToArray();
}

Если вы хотите получить более 10000 результатов, то во всех узлах данных использование памяти будет очень высоким, потому что он должен возвращать больше результатов в каждом запросе запроса. Тогда, если у вас есть больше данных и больше осколков, то слияние этих результатов будет неэффективным. Также es кэширует контекст фильтра, следовательно, снова больше памяти. Вы должны методом проб и ошибок, сколько именно вы принимаете. Если вы получаете много запросов в маленьком окне, вы должны сделать несколько запросов для более чем 10k и объединить его с помощью urself в коде, который должен занимать меньше памяти приложения, то если увеличить размер окна.

2) кажется, что API прокрутки не является для меня вариантом, но мне нужно увеличить "индекс.max_result_window". У кого-нибудь есть опыт с этим?

--> вы можете определить это значение в шаблонах индексов, шаблон es будет применим только для новых индексов ,поэтому вам нужно либо удалить старые индексы после создания шаблона, либо подождать, пока новые данные будут поглощены в elasticsearch .

{ "заказ": 1, "template": "index_template*", "настроить": { "индекс.number_of_replicas": "0", "индекс.number_of_shards": "1", "индекс.max_result_window": 2147483647 },

Comments

    Ничего не найдено.