В Elasticsearch,Пагинация является неотъемлемой частью операции запроса. По мере роста объема данных,как эффективно Пагинация Запросданные Насущные проблемы, которые необходимо решить。ElasticsearchТри главных Пагинация Способ:
from + size
、scroll
иsearch_after
。Эти три типа подробно представлены ниже.Пагинация Способиз Функциии Сценарии использования。
from + size
даElasticsearchсамый интуитивный Пагинация Способ。в,from
Параметр указывает, с какой записи начинать возврат.,size
Параметр указывает количество возвращаемых записей.。
from + size
Принцип пейджинга относительно прост. Когда вы выполняете поисковый запрос и указываете from
и size
Параметры, Elasticsearch Будут выполнены следующие шаги:
from + size
документы, соответствующие критериям (а на самом деле только последний size
полоска).from
начиная с позиции size
записи и вернуть их клиенту.потому что from + size
Необходимо объединить результаты, возвращаемые всеми шардами, чтобы при from
При больших значениях этот процесс может стать очень медленным, поскольку необходимо обработать большой объем данных.
В Elasticsearch,использоватьfrom
иsize
руководить Пагинация ЗапросизDSL(Domain Specific Language):
GET /your_index/_search
{
"query": {
"match_all": {} // Это можно заменить любыми условиями запроса, которые вам нужны.
},
"from": 0, // Начиная с номера записи, индекс начинается с 0.
"size": 10, // Количество возвращенных записей
"sort": [
{ "field_name": {"order": "asc"}} // Необязательно, сортировать по полю
]
}
from
Параметр указывает, с какой записи начинать возврат,size
Параметры определяют Количество возвращенных записей。
Предположим, что файл с именемproducts
Индекс,Ищите товары со словом «яблоко» в названии.,И вернуть 10 результатов, начиная с 10-й записи,Сортировать по возрастанию цены сортировать:
GET /products/_search
{
"query": {
"match": {
"name": "apple"
}
},
"from": 9, // Обратите внимание, что индекс начинается с 0, поэтому индекс 10-й записи равен 9.
"size": 10,
"sort": [
{ "price": {"order": "asc"}}
]
}
from
установлен на9пропустить раньше9записи,size
установлен на10чтобы вернуть следующий10записи,и результат соответствуетprice
По возрастанию полей。
Elasticsearch вернет следующий ответ:
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 100, // Предположим, что всего имеется 100 продуктов, соответствующих условиям запроса.
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "products",
"_type": "_doc", // Примечание. В Elasticsearch В версиях 7.x и более поздних для поля _type обычно установлено значение «_doc».
"_id": "10",
"_score": 1.0,
"_source": {
"name": "Apple iPhone 12",
"price": 999.99,
// ... Другие поля
}
},
// ... Результаты для 9 других продуктов
{
"_index": "products",
"_type": "_doc",
"_id": "19",
"_score": 1.0,
"_source": {
"name": "Apple Watch Series 6",
"price": 399.99,
// ... Другие поля
}
}
]
}
}
from
Когда значение очень велико,Elasticsearch необходимо просмотреть большое количество данных, чтобы найти начальную позицию.,Затемвозвращатьсяsize
записи。Это приведет к Запросухудшение производительности,Особенно, если объем данных большой.Он подходит для сценариев с небольшим объемом данных и высокими требованиями к работе в режиме реального времени.
scroll
да Что-то вродена основекурсориз Пагинация Способ,Это позволяет нам перебирать большое количество поисков без пересчета всего поиска при каждом запросе.
scroll
Принцип листания аналогичен принципу курсора. Когда вы выполняете функцию с scroll
Запрос на поиск параметров, Elasticsearch встреча:
scroll_id
。этот scroll_id
Он однозначно идентифицирует контекст поиска.scroll_id
чтобы запросить дополнительные результаты. Elasticsearch получит больше результатов из снимка на основе ранее сохраненного контекста поиска и вернет их клиенту. Этот процесс можно повторять несколько раз, пока не будут получены все результаты или пока не истечет срок действия контекста поиска.потому что scroll
Контекст поиска необходимо рассчитать только один раз в начале, а результаты будут получены на основе этого контекста позже, поэтому обычно это лучше при работе с большими объемами данных. from + size
Быстрее. Однако он также потребляет больше ресурсов сервера для поддержания контекста поиска и снимков.
В Elasticsearch,scroll
да Что-то вроде用于检索Многоданные(возможныйдамиллионызаписи)из Пагинациямеханизм,Это позволяет вам сохранять «контекст» поиска и продолжать получать результаты.,без пересчета всего поиска для каждой страницы。нижедаиспользоватьscroll
руководить ПагинацияизDSLпример кода:
// Инициализировать поиск с прокруткой
POST /_search/scroll
{
"size": 100, // Количество документов, возвращаемых каждый раз
"scroll": "1m", // Как долго сохранять активным контекст прокрутки, здесь 1 минута.
"query": {
"match_all": {} // Можно заменить любыми желаемыми условиями запроса.
}
}
// Последующие запросы прокрутки (после возврата первого запроса)
POST /_search/scroll
{
"scroll": "1m", // Сохраняйте то же время контекста прокрутки, что и при первом запросе.
"scroll_id": "ваш идентификатор_скроллинга" // Scroll_id, возвращаемый первым запросом
}
иллюстрировать
POST /_search/scroll
Запрос вернет некоторые результаты(на основеsize
параметр)иscroll_id
。scroll_id
,Вы можете следить заизPOST /_search/scroll
просить Приходить Получите большеизрезультат。scroll
параметропределенныйсуществовать Как долго он может сохранятьсяscrollКонтекст действителен。еслисуществоватьэтотво времени Нетновыйизscrollпросить,Тогда контекст прокрутки будет удален,Больше не нужно получать больше результатов。результат ответа
Первый запрос вернет следующие результаты:
{
"_scroll_id": "DnF1ZXJ5THV6QXRlbl84791547351",
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": {
"value": 1000,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "your_index",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
// ... Источник данных документации ...
}
},
// ... Другие документы ...
]
}
}
Вы можете увидеть это в ответе_scroll_id
Поле,Это значение необходимо для последующих запросов на прокрутку.
Последующие запросы прокрутки
использовать Отвечая на вышеизложенноеиз_scroll_id
руководить Последующие запросы прокрутки:
POST /_search/scroll
{
"scroll": "1m",
"scroll_id": "DnF1ZXJ5THV6QXRlbl84791547351"
}
Этот запрос будет возвращать следующий пакет документов до тех пор, пока все документы не будут получены или пока не истечет срок действия контекста прокрутки.
по твоемуизElasticsearchкластериз Фактические настройкии Отрегулируйте в соответствии с потребностями производительностиsize
иscroll
параметризценить。
scroll
Курсор будет поддерживаться,Получить следующую порцию данных через курсор,и Нетда重новый计算整个搜索。Это делаетscroll
Обработка большого количестваданныеболее эффективный。scroll
можно получить Запрос Время началаизданные Снимок,и повсюдуscroll
в процессе Держатьэтот Снимок。Это значит вscroll
в процессе,Даже если записаны новые данные,Он также не будет включен в результаты запроса.scroll
дана основеданные Снимокиз,Поэтому он не подходит для сценариев, в которых необходимо получать самую свежую информацию в режиме реального времени.scroll
Будет потреблять многоиз Ресурсы сервера Приходить维护курсориданные Снимок,Поэтому необходима осторожность.Он подходит для сценариев, требующих обработки больших объемов данных и предъявляющих высокие требования не к реальному времени, таких как экспорт журналов, миграция данных и т. д.
search_after
да Что-то вродена основесортироватьценитьиз Пагинация Способ,Это позволяет нам получить данные следующей страницы на основе сортированного значения последних данных на предыдущей странице.
search_after
Принцип пейджинга заключается в определении начальной позиции следующего запроса на основе результатов предыдущего запроса. Когда вы выполняете функцию с search_after
Запрос на поиск параметров, Elasticsearch встреча:
search_after
параметр и используйте начальную позицию последнего запроса (то есть значение поля сортировки) в качестве значения этого параметра. Elasticsearch будет выполнять поиск на основе этого значения. начальную позицию следующего запрос и вернуть результат после этой позиции.потому что search_after
Не нужно быть похожим from + size
Таким образом, также возможно объединение результатов, возвращаемых всеми шардами. нужно быть похожим scroll
Таким образом, контекст поиска сохраняется, а снимок находится в Глубокий. пейджинг обычно более эффективен, чем любой из этих методов. Однако для обеспечения точного Определить значение поля сортировки должно быть уникальным. начальную позицию следующего запроса。
Есть программа под названиемproducts
Индекс,Содержит информацию о продукте,Я хочу сделать запрос Пагинация на основе цены продукта и времени выпуска.
1. Структура индекса
products
索引有нижеиз Полеструктура:
product_id
(тип ключевого слова, используемый в качестве уникального идентификатора документа)price
(тип float или Scaled_float, указывающий цену продукта)created_at
(тип даты, указывающий время выпуска продукта)2. исходный Запрос(Нетsearch_after
)
Сначала выполните первоначальный запрос, чтобы получить первую страницу результатов.,ина основеprice
(порядок убывания)иcreated_at
(По возрастанию)руководитьсортировать。
GET /products/_search
{
"size": 10,
"query": {
"match_all": {} // Или вы можете добавить конкретные условия запроса
},
"sort": [
{ "price": {"order": "desc"}},
{ "created_at": {"order": "asc"}}
]
}
3. Обработка ответа и подготовкаsearch_after
параметр
Последний документ можно получить из ответаизсортировать Полеценить(Прямо сейчасprice
иcreated_at
изценить)。Этиценить将用于Следующая страницаизsearch_after
просить。
Последний документ в ответ:
{
"_index": "products",
"_type": "_doc",
"_id": «Идентификатор последнего товара»,
"_score": null,
"_sort": [
129.99, // Стоимость последнего продукта
"2023-10-23T12:00:00Z" // созданное_значение последнего продукта
],
"_source": {
// ... Подробности о продукте ...
}
}
поместите это_sort
Полеизценить(Прямо сейчас129.99
и"2023-10-23T12:00:00Z"
)делатьдля Следующая страницапроситьсерединаизsearch_after
параметр。
4. использоватьsearch_after
руководить Следующая страница Запрос
использоватьsearch_after
Приходитьпросить Следующая страницаизданные:
GET /products/_search
{
"size": 10,
"query": {
"match_all": {} // Сохраняйте те же условия запроса, что и исходный запрос.
},
"sort": [
{ "price": {"order": "desc"}},
{ "created_at": {"order": "asc"}} // Сохраняйте тот же порядок полей, что и в исходном запросе.
],
"search_after": [
129.99, // Предыдущая страница Стоимость последнего продукта
"2023-10-23T12:00:00Z" // Предыдущая страницасозданное_значение последнего продукта
]
}
5. Повторите вышеуказанные шаги, чтобы получить больше страниц.
Вы можете продолжать выполнять описанные выше шаги, чтобы получить больше страниц.,до Нет Болееизрезультатвозвращатьсядляконец。Не забывайте делать это каждый разиспользовать Предыдущая страницапоследний документизсортировать Полеценить Приходитьнастраиватьsearch_after
параметр。
from + size
,search_after
существовать Глубокий Более эффективен при использовании пейджинга. Потому что это Не нужно быть похожимfrom + size
Таким образом получить исортировать Многоизданные,И вам нужно только получить данные следующей страницы на основе значения сортировки.search_after
允许我们跳过середина间изстраница,Получите данные непосредственно в указанном месте.search_after
нуждатьсяполагатьсяодинили Несколькосортировать Поле Приходить确定Следующая страницаиз Расположение。еслисортировать Полеизценить Нетдатолькоиз,Это может привести к неточным результатам запроса.search_after
Сравниватьscroll
Больше в режиме реального времени,Но он по-прежнему не может получить последние данные с момента инициирования запроса.Он подходит для сценариев, требующих глубокого разбиения на страницы, относительно высоких требований к работе в режиме реального времени и уникальных полей сортировки.
from
(начальное смещение)иsize
(размер страницы)Приходить Пагинация。по умолчаниюfrom
для0,size
для10。from
Когда значение очень велико,Производительность значительно упадет,Потому что Elasticsearch необходимо получить определенное количество документов из каждого сегмента.,Затем выполните глобальную сортировку на координационном узле для получения окончательного результата. Это приводит к значительной передаче данных по сети и потреблению ЦП/памяти.scroll_id
,Используется для получения данных следующей страницы.sort
Полеиспользовать。Какой метод пагинации выбрать, зависит от ваших конкретных потребностей и сценариев. Для наиболее частых нужд пагинации,from + size
(мелкий Пагинация)может быть достаточноиспользовать。нода,Если вам необходимо обработать большой объем данных или провести Глубокий пейджинг,Такscroll
илиsearch_after
возможныйдалучшеизвыбирать。
Выбирая метод пагинации Elasticsearch, вам необходимо основывать его на своих конкретных потребностях. использования Приходитьвзвешивать различные Способизотличныйнедостаток。from + size
Применимо кданные Не большое количество、в реальном временитребовательныйизсцена;scroll
Применимо кнуждаться遍历Многоданные、Нетв реальном временитребовательныйизсцена;иsearch_after
но Он подходит для сценариев, требующих глубокого разбиения на страницы, относительно высоких требований к работе в режиме реального времени и уникальных полей сортировки.посредством разумногоиспользовать Эти Пагинация Способ,Может улучшить производительность запросов Elasticsearch.,Лучше удовлетворяйте потребности бизнеса.