В Elasticsearch индекс (множественное число: индексы) содержит схему и может иметь один или несколько шардов и реплик. Индекс Elasticsearch делится на шарды, и каждый шард является экземпляром индекса Lucene.
Индексы используются для хранения документов в специальных структурах данных, соответствующих типу данных полей. Например, текстовые поля хранятся в инвертированном индексе, а числовые и геополя - в BKD-деревьях.
Примеры
Создание индекса
Следующий пример основан на Elasticsearch версии 5.x и выше. Будет создан индекс с двумя шардами, каждый из которых имеет одну реплику, с именем 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": [ "gsoft", "elasticsearch" ], "date": "01-01-2020" } |
Запрос к индексу
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 |
Общие проблемы
Хорошей практикой является определение настроек и отображения индекса по мере возможности, поскольку если этого не сделать, Elasticsearch попытается автоматически определить тип данных полей во время индексирования. Этот автоматический процесс может иметь недостатки, такие как конфликты отображения, дублирование данных и неправильные типы данных в индексе. Если поля не известны заранее, лучше использовать динамические шаблоны индексов.
Elasticsearch поддерживает шаблоны подстановочных знаков в именах индексов, что иногда помогает при запросах к нескольким индексам, но может быть и очень разрушительным. Например, можно удалить все индексы одной командой, используя следующие команды:
1 | DELETE /* |
Чтобы отключить это, вы можете добавить следующие строки в elasticsearch.yml:
1 | action.destructive_requires_name: true |
Контекст журнала
Журнал "обновление indices.store.throttle.type с [{}] на [{}]" имеет имя класса IndicesStore.java.
Мы извлекли следующее из исходного кода Elasticsearch для тех, кто ищет более подробный контекст:
1 2 3 4 5 6 7 8 9 10 11 | public void onRefreshSettings(Settings settings) { String rateLimitingType = settings.get(INDICES_STORE_THROTTLE_TYPE; IndicesStore.this.rateLimitingType); // try and parse the type StoreRateLimiting.Type.fromString(rateLimitingType); if (!rateLimitingType.equals(IndicesStore.this.rateLimitingType)) { logger.info("updating indices.store.throttle.type from [{}] to [{}]"; IndicesStore.this.rateLimitingType; rateLimitingType); IndicesStore.this.rateLimitingType = rateLimitingType; IndicesStore.this.rateLimiting.setType(rateLimitingType); } ByteSizeValue rateLimitingThrottle = settings.getAsBytesSize(INDICES_STORE_THROTTLE_MAX_BYTES_PER_SEC; IndicesStore.this.rateLimitingThrottle); |