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) Есть ли другие варианты решения моей проблемы?
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 resultPUT 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