В OpenSearch индекс содержит схему и может иметь один или несколько шардов и реплик. Индекс OpenSearch делится на шарды, и каждый шард является экземпляром индекса Lucene.
Индексы используются для хранения документов в специальных структурах данных, соответствующих типу данных полей. Например, текстовые поля хранятся в инвертированном индексе, а числовые и геополя - в BKD-деревьях.
Примеры
Создание индекса
В следующем примере OpenSearch, будет создан индекс с двумя шардами, каждый из которых имеет одну реплику, с именем test_index1
1 2 3 4 5 6 7 8 9 10 11 12 13 | PUT /test_index1?pretty { "settings" : { "number_of_shards" : 2, "number_of_replicas" : 1 }, "mappings" : { "properties" : { "tags" : { "type" : "keyword" }, "updated_at" : { "type" : "date" } } } } |
Список индексов
Все имена индексов и их основная информация могут быть получены с помощью следующей команды:
1 | GET _cat/indices?v |
Индексирование документа
Добавим документ в индекс с помощью следующей команды:
1 2 3 4 5 6 7 8 | PUT test_index1/_doc/1 { "tags": [ "test", "OpenSearch" ], "date": "01-01-2023" } |
Запрос к индексу
1 2 3 4 5 6 | GET test_index1/_search { "query": { "match_all": {} } } |
Запрос по нескольким индексам
Одним запросом можно выполнить поиск по нескольким индексам. Если это необработанный HTTP-запрос, то имена индексов должны быть отправлены в формате с разделителями-запятыми, как показано в примере ниже, а в случае запроса через клиент на языке программирования, например python или Java, имена индексов должны быть отправлены в формате списка.
1 | GET test_index1,test_index2/_search |
Удаление индексов
1 | DELETE test_index1 |
Общие проблемы
Хорошей практикой является определение настроек и маппинга индекса там, где это возможно, поскольку в противном случае OpenSearch пытается автоматически определить тип данных полей при индексировании. Такой автоматический процесс может иметь свои недостатки, такие как конфликты маппингов, дублирование данных и установка неправильных типов данных в индексе. Если поля не известны заранее, лучше использовать динамические шаблоны индексов.
OpenSearch поддерживает шаблоны подстановочных символов в именах индексов, что иногда помогает при запросах к нескольким индексам, но может быть и весьма разрушительным. Например, можно удалить все индексы одной командой, используя следующие команды:
1 | DELETE /* |
Чтобы отключить это, можно добавить следующие строки в OpenSearch.yml:
1 | action.destructive_requires_name: true |