Кажется, ваш вопрос больше о слиянии индексов, чем о самом индексировании.
Если игнорировать низкоуровневые детали, процесс индексирования довольно прост. Lucene образуют так называемый «инвертированный индекс» из документов. Поэтому, если приходит документ с текстом «Быть или не быть» и id = 1, инвертированный индекс будет выглядеть так:
[to] → 1
[be] → 1
[or] → 1
[not] → 1
По сути, это он - указатель от слова к списку документов, содержащих данное слово. Каждая строка этого указателя (слова) называется списком рассылки. Затем этот индекс сохраняется в долгосрочном хранилище.
На самом деле все, конечно, сложнее:
- Lucene может пропускать некоторые слова в зависимости от конкретного анализатора;
- слова могут быть предварительно обработаны с использованием алгоритма выделения корней для уменьшения флексии языка;
- Список рассылки может содержать не только идентификаторы документов, но и смещение данного слова внутри документа (возможно несколько экземпляров) и некоторую другую дополнительную информацию.
Есть еще много сложностей, которые не так важны для базового понимания.
Однако важно понимать, что индекс Lucene только добавляется . В какой-то момент приложение решает зафиксировать (опубликовать) все изменения в индексе. Lucene завершает все служебные операции с индексом и закрывает его, чтобы он стал доступен для поиска. После фиксации индекс практически неизменен. Этот индекс (или часть индекса) называется сегментом . Когда Lucene выполняет поиск по запросу, он ищет во всех доступных сегментах.
Возникает вопрос - как изменить уже проиндексированный документ ?
Новые документы или новые версии уже проиндексированных документов индексируются в новых сегментах, а старые версии аннулируются в предыдущих сегментах с использованием так называемого списка уничтожения . Kill list - единственная часть зафиксированного индекса, которая может изменяться. Как вы могли догадаться, эффективность индексации со временем падает, потому что старые индексы могут содержать в основном удаленные документы.
Вот здесь-то и появляется слияние. Слияние - это процесс объединения нескольких индексов, чтобы сделать индекс в целом более эффективным. Что в основном происходит во время слияния, так это то, что живые документы копируются в новый сегмент, а старые сегменты полностью удаляются.
Используя этот простой процесс, Lucene может поддерживать индекс в хорошем состоянии с точки зрения производительности поиска.
Надеюсь, это поможет.