Сортировка индекса
При создании нового индекса в Elasticsearch можно настроить порядок сортировки сегментов внутри каждого фрагмента. По умолчанию Lucene не применяет никакой сортировки. Параметры index.sort.* определяют, какие поля должны использоваться для сортировки документов внутри каждого сегмента.
Вложенные поля несовместимы с сортировкой индекса, поскольку предполагается, что вложенные документы хранятся в смежных идентификаторах документов, что может нарушаться при сортировке индекса. Если сортировка индекса активирована для индекса, содержащего вложенные поля, будет выброшено исключение.
Например, следующий пример демонстрирует, как задать сортировку по одному полю:
PUT my-index-000001
{
"settings": {
"index": {
"sort.field": "date",
"sort.order": "desc"
}
},
"mappings": {
"properties": {
"date": {
"type": "date"
}
}
}
} | Этот индекс отсортирован по полю | |
| … в порядке убывания. |
Также можно отсортировать индекс по нескольким полям:
PUT my-index-000001
{
"settings": {
"index": {
"sort.field": [ "username", "date" ],
"sort.order": [ "asc", "desc" ]
}
},
"mappings": {
"properties": {
"username": {
"type": "keyword",
"doc_values": true
},
"date": {
"type": "date"
}
}
}
} | Этот индекс отсортирован по полю | |
| … в порядке возрастания для поля |
Сортировка индекса поддерживает следующие параметры:
-
index.sort.field - Список полей, используемых для сортировки индекса. Здесь допускаются только поля типа
boolean,numeric,dateиkeywordс типомdoc_values. -
index.sort.order -
Порядок сортировки для каждого поля. Параметр order может принимать следующие значения:
-
asc: Для возрастания -
desc: Для убывания.
-
-
index.sort.mode -
Elasticsearch поддерживает сортировку по многозначным полям. Параметр mode управляет тем, какое значение выбирается для сортировки документа. Параметр mode может принимать следующие значения:
-
min: Выбрать наименьшее значение. -
max: Выбрать наибольшее значение.
-
-
index.sort.missing -
Параметр missing определяет, как должны обрабатываться документы, в которых отсутствует поле. Параметр missing может принимать следующие значения:
-
_last: Документы без значения для поля сортируются последними. -
_first: Документы без значения для поля сортируются первыми.
-
Сортировка индекса может быть определена только один раз при создании индекса. Добавление или обновление сортировки существующего индекса не допускается. Сортировка индекса также влечет за собой затраты на пропускную способность индексирования, поскольку документы должны быть отсортированы во время сброса и слияния. Перед активацией этой функции необходимо протестировать ее влияние на ваше приложение.
Раннее завершение запроса поиска
По умолчанию в Elasticsearch запрос поиска должен посетить каждый документ, соответствующий запросу, чтобы получить верхние документы, отсортированные по заданной сортировке. Однако, когда сортировка индекса и сортировка поиска совпадают, можно ограничить количество документов, которые должны быть посещены в каждом сегменте для получения N верхних документов глобально. Например, предположим, что у нас есть индекс, содержащий события, отсортированные по полю timestamp:
PUT events
{
"settings": {
"index": {
"sort.field": "timestamp",
"sort.order": "desc"
}
},
"mappings": {
"properties": {
"timestamp": {
"type": "date"
}
}
}
} | Этот индекс отсортирован по полю timestamp в порядке убывания (сначала самые свежие) |
Вы можете найти последние 10 событий с помощью:
GET /events/_search
{
"size": 10,
"sort": [
{ "timestamp": "desc" }
]
} Elasticsearch определит, что верхние документы каждого сегмента уже отсортированы в индексе, и будет сравнивать только первые N документов в каждом сегменте. Остальные документы, соответствующие запросу, собираются для подсчета общего количества результатов и построения агрегаций.
Если вы ищете только последние 10 событий и вас не интересует общее количество документов, соответствующих запросу, вы можете установить track_total_hits в значение false:
GET /events/_search
{
"size": 10,
"sort": [
{ "timestamp": "desc" }
],
"track_total_hits": false
} | Сортировка индекса будет использоваться для ранжирования верхних документов, и каждый сегмент будет рано завершать сбор после первых 10 совпадений. |
В этот раз Elasticsearch не будет пытаться подсчитать количество документов и сможет завершить запрос, как только будет собрано N документов в каждом сегменте.
{
"_shards": ...
"hits" : {
"max_score" : null,
"hits" : []
},
"took": 20,
"timed_out": false
} | Общее количество совпадений с запросом неизвестно из-за раннего завершения. |
Агрегации будут собирать все документы, соответствующие запросу, независимо от значения track_total_hits
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/index-modules-index-sorting.html