Elasticearch 2.1: окно результатов слишком велико (index.max_result_window)
Мы извлекаем информацию из Elasticsearch 2.1 и позволяем пользователю распечатывать результаты. Когда пользователь запрашивает высокий номер страницы, мы получаем следующее сообщение об ошибке:
Окно результатов слишком велико, размер + должен быть меньше или равен к: [10000], но был [10020]. См. Прокрутку api для более эффективного способ запросить большие наборы данных. Этот предел можно установить, изменив [index.max_result_window] параметр уровня индекса
Эластичный документ говорит, что это связано с высоким потреблением памяти и использованием прокрутки api:
Значения выше, чем могут потреблять значительные куски памяти кучи за поиск и на каждый черед, выполняющий поиск. Безопаснее всего оставить это значение, поскольку это использование прокрутки api для любой глубокой прокрутки https://www.elastic.co/guide/en/elasticsearch/reference/2.x/breaking_21_search_changes.html#_from_size_limits
Дело в том, что я не хочу извлекать большие наборы данных. Я хочу только получить фрагмент из набора данных, который очень высок в наборе результатов. Также в прокручиваемом документе говорится:
Прокрутка не предназначена для пользовательских запросов в реальном времени https://www.elastic.co/guide/en/elasticsearch/reference/2.2/search-request-scroll.html
Это оставляет мне несколько вопросов:
1) Если бы потребление памяти действительно было ниже (если это возможно, почему), если я использую прокрутку api для прокрутки до результата 10020 (и игнорировать все ниже 10000) вместо выполнения "обычного" запроса поиска для результата 10000- 10020?
2) Не похоже, что API прокрутки является для меня вариантом, но мне нужно увеличить "index.max_result_window". Кто-нибудь имеет опыт с этим?
3) Есть ли другие варианты решения моей проблемы?
Ответы
Ответ 1
Следующие страницы в эластичной документации говорят о глубокой подкачки:
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 страниц) должны быть совершенно выполнимы. Но с достаточно большим значения, процесс сортировки может стать очень тяжелым, используя огромные количества CPU, памяти и полосы пропускания. По этой причине мы сильно советуем против глубокого оповещения.
Ответ 2
Если вам нужна большая глубокая разбивка на страницы, я думаю, что только один вариант решения - увеличить значение max_result_window
curl -XPUT "http://localhost:9200/my_index/_settings" -d '{ "index" : { "max_result_window" : 500000 } }'
Увеличение использования памяти, я не найден для значений ~ 100k
Ответ 3
Правильным решением будет использование прокрутки.
Однако, если вы хотите расширить результаты, search
возвращает более 10 000 результатов, вы можете легко сделать это с помощью Kibana:
Перейдите к Dev Tools
и просто разместите следующее в своем индексе (ваше_имя_имя_имя), указав, каким будет новое окно максимального результата
![введите описание изображения здесь]()
PUT your_index_name/_settings
{
"max_result_window" : 500000
}
Если все пойдет хорошо, вы должны увидеть следующий ответ успеха:
{
"acknowledged": true
}
Ответ 4
Используйте API прокрутки, чтобы получить более 10000 результатов.
Пример прокрутки в API-интерфейсе ElasticSearch NEST
Я использовал его так:
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();
}
Ответ 5
Если вы хотите получить более 10000 результатов, то во всех узлах данных использование памяти будет очень высоким, поскольку оно должно возвращать больше результатов в каждом запросе запроса. Тогда, если у вас больше данных и больше осколков, тогда слияние этих результатов будет неэффективным. Также es кэширует контекст фильтра, следовательно, снова больше памяти. Вы должны пройти пробную и пробную версию, сколько именно вы принимаете. Если вы получаете много запросов в маленьком окне, вы должны выполнить несколько запросов более чем на 10 тыс. И объединить их с помощью urself в коде, который, как предполагается, займет меньше памяти приложения, если увеличить размер окна.
Ответ 6
2) Не похоже, что API прокрутки является для меня вариантом, но мне нужно увеличить "index.max_result_window". Кто-нибудь имеет опыт с этим?
- > Вы можете определить это значение в шаблонах индексов, шаблон es будет применяться только для новых индексов, поэтому вам нужно либо удалить старые индексы после создания шаблона, либо дождаться появления новых данных в elasticsearch.
{ "порядок": 1, "шаблон": "index_template *", "Настройки": { "index.number_of_replicas": "0", "index.number_of_shards": "1", "index.max_result_window": 2147483647 },
Ответ 7
Основная причина, по которой вы получаете эту ошибку - это потому, что вы используете эластичный поиск неправильно. ES - поисковая система. Это неэффективно для получения многих элементов или многих страниц данных. Может быть, вы пытаетесь вернуть все свои данные с помощью эластичного поиска, а не только для поиска соответствующих результатов? Это неверно.
Вы должны использовать его для поиска. И я думаю, что не нужно получать более 10 000 результатов. Например, Google возвращает только первые 1000 результатов.