Подтвердить что ты не робот

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

4b9b3361

Ответ 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 результатов.