В OpenSearch псевдоним - это вторично присвоенное имя, относящееся к группе потоков данных или индексов. Псевдонимы могут создаваться и удаляться динамически с помощью REST-точки _aliases.
Существует два типа псевдонимов:
- Псевдонимы потоков данных: Псевдоним потока данных относится к одному или нескольким потокам данных. Имена потоков данных будут обозначаться псевдонимами потоков данных. В состоянии кластера псевдонимы потоков данных хранятся отдельно от потоков данных.
- Псевдонимы индексов: Псевдоним индекса указывает на один или несколько индексов.
Ведущий узел управляет состоянием кластера, которое включает псевдонимы.
Создание и удаление псевдонимов
Создание псевдонима на одном индексе:
1 2 3 4 5 6 7 8 9 10 11 | POST /_aliases?pretty { "actions": [ { "add": { "index": "index_1", "alias": "alias_1" } } ] } |
Создание псевдонима, привязанного более чем к одному индексу:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | POST /_aliases?pretty { "actions": [ { "add": { "index": "index_1", "alias": "alias_1" } }, { "add": { "index": "index_2", "alias": "alias_1" } } ] } |
Вывод списка всех доступных псевдонимов в кластере OpenSearch:
1 | GET _cat/aliases |
Удаление псевдонима:
1 2 3 4 5 6 7 8 9 10 11 | POST /_aliases?pretty { "actions": [ { "remove": { "index": "index_2", "alias": "alias_1" } } ] } |
Варианты использования псевдонимов
Псевдонимы используются для различных целей, например, для поиска по нескольким индексам с одним именем, выполнения процесса переиндексации с минимальным временем простоя и запроса данных на основе предопределенных фильтров. Ниже приведены 6 различных вариантов использования псевдонимов.
Псевдонимы на основе фильтров для ограничения доступа к данным
Одним из вариантов использования является создание псевдонимов на основе фильтров, что весьма полезно при необходимости ограничения доступа к данным. При выполнении запроса псевдоним может автоматически применять фильтр.
Например, рассмотрим индекс с именем index-idx, имеющий псевдоним, указывающий на группы, содержащие компанию "Test". Вы можете создать псевдоним, который будет автоматически выполнять эту фильтрацию, как показано в следующих шагах.
Документы индекса:
1 2 3 4 5 | PUT /index-idx/_doc/1 { "title": "Taking Care of Your Entire Search Operation", "company": "Test" } |
1 2 3 4 5 | PUT /index-idx/_doc/2 { "title": "Streaming service", "company": "XYZ" } |
Добавьте запрос к действиям в параметре "filter", чтобы создать псевдоним фильтра. Запрос здесь используется для ограничения документов, к которым псевдоним может получить доступ.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | POST /_aliases?pretty { "actions": [ { "add": { "index": "index-idx", "alias": "index-alias", "filter": { "term": { "company": "test" } } } } ] } |
При выполнении запроса match-all по index-alias в результатах поиска появятся только те документы, которые соответствуют термину запроса (который был добавлен при построении фильтра алиаса, т.е. документы с названием компании, равным "Test").
Поисковый запрос:
1 2 3 4 5 6 | GET index-alias/_search { "query":{ "match_all":{} } } |
Ответ на поиск:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | "hits": { "total": { "value": 1, "relation": "eq" }, "max_score": 1.0, "hits": [ { "_index": "index-idx", "_id": "1", "_score": 1.0, "_source": { "title": "Taking Care of Your Entire Search Operation", "company": "Test" } } ] } |
Теперь, если вы попытаетесь запросить документы, содержащие название компании "XYZ", следующим образом:
1 2 3 4 5 6 7 8 | GET index-alias/_search { "query": { "match": { "company": "XYZ" } } } |
Теперь, если вы попытаетесь запросить документы, содержащие название компании "XYZ", следующим образом:
1 2 3 4 5 6 7 8 | "hits": { "total": { "value": 0, "relation": "eq" }, "max_score": null, "hits": [] } |
Комбинирование маршрутизации с псевдонимами
В следующем примере при поиске и индексировании отфильтровывается компания "test" и добавляется "1" к маршруту, чтобы ограничить место поиска.
Маршрут - это строковое значение, которое используется для направления операций индексирования и поиска на определенный шард.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | POST /_aliases?pretty { "actions": [ { "add": { "index": "index_1", "alias": "alias_2", "filter": { "term": { "company": "test" } }, "routing": "1" } } ] } |
Переход к новым индексам
Псевдонимы можно использовать в тех случаях, когда приложению требуется плавный переход от старого индекса к новому без простоев.
Создание скользящих окон в отдельных индексах
Например, при построении ежедневных индексов для данных можно создать псевдоним с именем "last-7-days" для создания скользящего окна данных за предыдущие семь дней. Тогда каждый день, создавая новый суточный индекс, можно добавлять его в псевдоним и одновременно удалять индекс 8-дневной давности.
Псевдонимы и ILM для обновления или удаления документов
Вы можете использовать псевдоним индекса и шаблон индекса с ILM для управления и переноса индексов псевдонима, если Вам необходимо часто обновлять или удалять существующие документы в многочисленных индексах.
Запрос данных из замороженного индекса
При использовании ILM, если вам все же необходимо запросить данные из замороженного индекса, вы можете использовать для этого псевдоним. Вместо того чтобы искать данные непосредственно в индексе, можно выполнить поисковый запрос по псевдониму, что увеличит производительность и позволит получить ответ с меньшими затратами ресурсов.
Примечания
- Псевдоним не может быть использован в процессе индексирования, если он указывает на более чем один индекс. В случае попытки OpenSearch выбросит исключение.
- Удаление псевдонима не приводит к удалению фактического индекса.
Общие проблемы
При попытке проиндексировать документ по псевдониму, который указывает более чем на один индекс, OpenSearch выдает ошибку, поскольку не знает, в какой конкретный индекс следует проиндексировать документ.
Вы получите следующее сообщение об ошибке:
1 2 3 4 5 6 7 8 9 10 11 12 13 | { "error" : { "root_cause" : [ { "type" : "illegal_argument_exception", "reason" : "no write index is defined for alias [my-alias]. The write index may be explicitly disabled using is_write_index=false or the alias points to multiple indices without one being designated as a write index" } ], "type" : "illegal_argument_exception", "reason" : "no write index is defined for alias [my-alias]. The write index may be explicitly disabled using is_write_index=false or the alias points to multiple indices without one being designated as a write index" }, "status" : 400 } |