Реиндексация данных
Реиндексация — это процесс копирования документов из одного индекса в другой. Ее применяют в случаях, когда требуется изменить структуру данных (маппинг полей), создать резервную копию, обновить неизменяемые настройки индекса или переименовать его.
При создании временных индексов (например, для переиндексации данных, изменения маппинга или резервного копирования) устанавливайте количество реплик (number_of_replicas) в 0 на время реиндексации. После завершения: верните исходное значение количества реплик (number_of_replicas).
Переиндексация всех документов
Для того чтобы скопировать все документы из одного индекса в другой, выполните следующее:
1. Создание целевого индекса
Сначала необходимо создать целевой индекс с требуемой структурой полей (маппингом) и настройками. Вы можете задать их вручную или скопировать из исходного индекса.
PUT <index-name>
{
"mappings": {
... // Укажите нужный маппинг
},
"settings": {
... // Укажите нужные настройки
}
}
2. Выполнение операции Reindex
После этого выполните запрос _reindex для копирования всех документов из исходного индекса в целевой.
POST _reindex
{
"source":{
"index":"source"
},
"dest":{
"index":"<index-name>"
}
}
Если целевой индекс не был создан заранее, операция _reindex автоматически создаст его с конфигурацией по умолчанию, что может не соответствовать вашим требованиям.
Выборочная реиндексация документов
Операция _reindex позволяет копировать не весь индекс, а только определенное подмножество документов, соответствующих поисковому запросу.
Пример: копирование документов по условию
Следующий запрос скопирует в целевой индекс только те документы, в которых поле field_name содержит значение text.
POST _reindex
{
"source":{
"index":"source",
"query": {
"match": {
"field_name": "text"
}
}
},
"dest":{
"index":"<index-name>"
}
}
Полный перечень доступных операций приведен в официальной документации OpenSearch.
Объединение нескольких индексов
Операция _reindex позволяет объединить документы из нескольких исходных индексов в один целевой. Для этого необходимо указать индексы-источники в виде списка.
Пример: объединение двух индексов
Следующий запрос скопирует все документы из индексов source_1 и source_2 в индекс destination.
POST _reindex
{
"source":{
"index":[
"source_1",
"source_2"
]
},
"dest":{
"index":"destination"
}
}
Убедитесь, что количество шардов в исходных и целевом индексах совпадает. В противном случае операция может завершиться ошибкой.
Преобразование документов во время реиндексации
Операция _reindex позволяет не только копировать, но и преобразовывать данные в процессе переноса. Для этого можно использовать два подхода: встроенные скрипты или ingest-пайплайны.
Способ 1: Использование скриптов
Для простых преобразований непосредственно в запросе реиндексации используется раздел script. Рекомендуемый язык скриптов — Painless.
Пример: увеличиваем значение числового поля account.number на 1 для каждого документа
POST _reindex
{
"source":{
"index":"source"
},
"dest":{
"index":"<index-name>"
},
"script":{
"lang":"painless",
"source":"ctx._account.number++"
}
}
Способ 2: Использование ingest-пайплайна
Для преобразования документов в процессе реиндексации также можно использовать ingest-пайплайн.
- Создайте пайплайн с определенными процессорами (processors). Для использования в пайплайне доступно множество различных процессоров
Пример пайплайна, в котором:
splitразделяет полеtextпо пробелам и результат сохраняет в новое полеwordscriptна Painless вычисляет длинуwordи сохраняет результат в новое полеword_countremoveудаляет полеtest
PUT _ingest/pipeline/pipeline-test
{
"description": "Преобразует текстовое поле в список. Вычисляет длину поля 'word' и сохраняет ее в новом поле 'word_count'. Удаляет поле 'test'",
"processors": [
{
"split": {
"field": "text",
"separator": "\\s+",
"target_field": "word"
}
},
{
"script": {
"lang": "painless",
"source": "ctx.word_count = ctx.word.length"
}
},
{
"remove": {
"field": "test"
}
}
]
}
- Выполните реиндексацию с пайплайном
POST _reindex
{
"source": {
"index": "source"
},
"dest": {
"index": "<index-name>",
"pipeline": "pipeline-test"
}
}
Обновление документов в текущем индексе
Для обновления данных непосредственно в текущем индексе без создания нового индекса используйте операцию update_by_query.
Особенности операции:
- операция выполняется методом
POST - одновременно может работать только с одним индексом
POST <index_name>/_update_by_query
Если запустить эту команду без параметров, она увеличит номер версии для всех документов в указанном индексе.
Параметры исходного индекса
| Параметр | Допустимые значения | Описание | Обязательный |
|---|---|---|---|
index | String | Имя исходного индекса. Можно указать несколько индексов в виде списка. | ДА |
max_docs | Integer | Максимальное количество документов для переиндексации. | НЕТ |
query | Object | Поисковый запрос для выбора документов при операции переиндексации. | НЕТ |
size | Integer | Количество документов для переиндексации. | НЕТ |
slice | String | Задает ручную или автоматическую параллелизацию (слайсинг) для ускорения процесса переиндексации. | НЕТ |
Параметры целевого индекса
| Параметр | Допустимые значения | Описание | Обязательный |
|---|---|---|---|
index | String | Имя целевого индекса. | ДА |
version_type | Enum | Тип контроля версий для операции индексации. Допустимые значения: internal, external, external_gt, external_gte. | НЕТ |