Понимание сегментов в Elasticsearch

Я был в предположении, что каждый осколок в Elasticsearch является индексом. Но я где-то читал, что каждый сегмент является индексом Lucene.

Что такое сегмент? Как это влияет на эффективность поиска? У меня есть индексы размером около 450 ГБ каждый день (каждый день я создаю новый) с настройками по умолчанию Elasticsearch.

Когда я выполняю curl -XPOST "http://localhost:9200/logstash-2013.03.0$i_optimize?max_num_segments=1", я получаю num_committed_segments=11 и num_search_segments=11.

Не должны ли значения выше 1? Может быть, из-за значения index.merge.policy.segments_per_tier? Что это за уровень в любом случае?

Ответ 1

Слово "index" немного злоупотребляет в Elasticsearch - применяется к слишком многим вещам.

Объяснить:

Индекс

"Индекс" в Elasticsearch немного похож на базу данных в реляционной БД. Это где вы храните/индексируете свои данные. Но на самом деле это то, что видит ваше приложение. Внутренне индекс является логическим пространством имен, которое указывает на один или несколько черепах.

Кроме того, "индексировать" означает "помещать" ваши данные в Elasticsearch. Ваши данные хранятся (для извлечения) и "индексируются" для поиска.

инвертированный индекс

"Инвертированный индекс" - это структура данных, которую использует Lucene для обеспечения возможности поиска данных. Он обрабатывает данные, извлекает уникальные термины или жетоны, а затем записывает, какие документы содержат эти жетоны. Подробнее см. http://en.wikipedia.org/wiki/Inverted_index.

осколок

"Осколок" - это пример Люцене. Это полностью функциональная поисковая система сама по себе. "Индекс" может состоять из одного осколка, но обычно он состоит из нескольких осколков, позволяющих индексу расти и разбиваться на несколько машин.

"Основной осколок" является основным домом для документа. "Осколок реплики" - это копия основного осколка, которая обеспечивает (1) переход на другой ресурс в случае, если первичные матрицы и (2) увеличенная пропускная способность чтения

Сегмент

Каждый осколок содержит несколько "сегментов", где сегмент является инвертированным индексом. Поиск в осколке будет поочередно выполнять поиск по каждому сегменту, а затем объединить результаты в конечные результаты для этого осколка.

Пока вы индексируете документы, Elasticsearch собирает их в памяти (и в журнале транзакций для обеспечения безопасности), то каждую секунду или около того, записывает новый маленький сегмент на диск и "обновляет" поиск.

Это делает данные в новом сегменте видимыми для поиска (т.е. они "доступны для поиска" ), но сегмент не был синхронизирован с диском, поэтому он все еще подвержен риску потери данных.

Каждый так часто Elasticsearch "смывается", что означает fsync'ing сегментов (теперь они "совершены" ) и очистке журнала транзакций, который больше не нужен, потому что мы знаем, что новые данные были записанный на диск.

Чем больше сегментов, тем длиннее каждый поиск. Таким образом, Elasticsearch объединит несколько сегментов одинакового размера ( "уровень" ) в один более крупный сегмент с помощью процесса объединения фона. После записи нового более крупного сегмента старые сегменты отбрасываются. Этот процесс повторяется на больших сегментах, когда слишком много одинакового размера.

Сегменты неизменяемы. Когда документ обновляется, он фактически просто удаляет старый документ и индексирует новый документ. Процесс слияния также исключает эти старые удаленные документы.