Мы получаем информацию из 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) Есть ли другие варианты решения моей проблемы?
источник
'Result window is too large, from + size must be less than or equal to: [10000] but was [47190]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter.')
Он сказал, что у него 4719 страниц (каждая страница 10 результатов). и я думаю, что ваше предложение работает.{ "max_result_window" : 500000 }
это работало. Таким образом, команда локон стал -curl -XPUT "http://localhost:9200/my_index/_settings" -d '{ "max_result_window" : 500000 }'
Правильным решением будет использование прокрутки.
Однако, если вы хотите расширить
search
возвращаемые результаты за пределы 10 000 результатов, вы можете легко сделать это с помощью Kibana:Перейдите по
Dev Tools
ссылке и просто опубликуйте следующее в свой индекс (your_index_name), указав, каким будет новое окно максимального результатаЕсли все пойдет хорошо, вы должны увидеть следующий успешный ответ:
источник
На следующих страницах эластичной документации говорится о глубоком разбиении на страницы:
https://www.elastic.co/guide/en/elasticsearch/guide/current/pagination.html https://www.elastic.co/guide/en/elasticsearch/guide/current/_fetch_phase.html
источник
Используйте Scroll API, чтобы получить более 10000 результатов.
Пример прокрутки в ElasticSearch NEST API
Я использовал это так:
источник
Если вы хотите получить более 10000 результатов, то во всех узлах данных использование памяти будет очень высоким, потому что он должен возвращать больше результатов в каждом запросе запроса. Тогда, если у вас будет больше данных и больше осколков, объединение этих результатов будет неэффективным. Также es кэширует контекст фильтра, следовательно, снова больше памяти. Вы должны методом проб и ошибок, сколько именно вы берете. Если вы получаете много запросов в маленьком окне, вы должны выполнить несколько запросов для более чем 10 КБ и объединить их самостоятельно в код, который должен занять меньше памяти приложения, чем если вы увеличите размер окна.
источник
2) Мне не кажется, что API прокрутки - вариант для меня, но мне нужно увеличить index.max_result_window. У кого-нибудь есть опыт с этим?
-> Вы можете определить это значение в шаблонах индексов, шаблон es будет применим только для новых индексов, поэтому вам нужно либо удалить старые индексы после создания шаблона, либо подождать, пока новые данные будут введены в elasticsearch.
{"order": 1, "template": "index_template *", "settings": {"index.number_of_replicas": "0", "index.number_of_shards": "1", "index.max_result_window": 2147483647},
источник
В моем случае похоже, что уменьшение результатов с помощью префиксов from & size к запросу устранит ошибку, поскольку нам не нужны все результаты:
источник