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

69 голосов | спросил Ronald 4 FebruaryEurope/MoscowbThu, 04 Feb 2016 19:30:24 +0300000000pmThu, 04 Feb 2016 19:30:24 +030016 2016, 19:30:24

6 ответов


0

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

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

  

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

ответил Ronald 5 FebruaryEurope/MoscowbFri, 05 Feb 2016 13:35:06 +0300000000pmFri, 05 Feb 2016 13:35:06 +030016 2016, 13:35:06
0

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

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

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

ответил Andrey Morozov 5 FebruaryEurope/MoscowbFri, 05 Feb 2016 14:29:33 +0300000000pmFri, 05 Feb 2016 14:29:33 +030016 2016, 14:29:33
0

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

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

 введите описание изображения здесь

PUT your_index_name/_settings
{ 
  "max_result_window" : 500000 
}

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

{
  "acknowledged": true
}
ответил Guy Dubrovski 12 J0000006Europe/Moscow 2017, 02:38:50
0

Используйте 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();
}
ответил Morten Holmgaard 11 Jpm1000000pmWed, 11 Jan 2017 15:51:53 +030017 2017, 15:51:53
0

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

ответил Amritendu 11 MaramSat, 11 Mar 2017 10:42:38 +03002017-03-11T10:42:38+03:0010 2017, 10:42:38
0

2) Похоже, что API прокрутки мне не подходит, но мне нужно увеличить «index.max_result_window». У кого-нибудь есть опыт с этим?

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

{     «заказ»: 1,     "template": "index_template *",     "настройки": {      "index.number_of_replicas": "0",         "index.number_of_shards": "1",         "index.max_result_window": 2147483647     },

ответил Sindhu 26 AMpWed, 26 Apr 2017 00:19:57 +030019Wednesday 2017, 00:19:57

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132