intermediate
Inverted index
Понимайте term-to-document maps, postings lists, scoring и refresh behavior как core search data structure.
Инвертированный индекс сопоставляет каждый термин со списком документов (postings), где он встречается — базовая структура быстрого полнотекстового поиска. Вместо сканирования всех документов движок ищет термин и пересекает списки вхождений.
термин "клавиатура" → [doc1, doc7, doc42]
термин "беспроводная" → [doc1, doc9]
запрос AND → [doc1]
В posting часто хранятся позиции и payloads для фразовых запросов и scoring. Сегменты на диске неизменяемы; новые записи идут в свежие сегменты до merge. Refresh открывает новые сегменты для читателей поиска.
На интервью: объясните, почему инвертированный индекс быстр для токенов, но слаб для произвольных подстрок и неиндексированных полей; свяжите postings с BM25; назовите merge и refresh как ручки latency vs freshness.
Типовые ошибки: ждать быстрый `contains` по неанализированной подстроке; гигантские posting lists по стоп-словам без фильтрации; не понимать, что удаления часто — tombstone до merge; путать инвертированный индекс с B-tree по первичному ключу.
Компромисс — молниеносный поиск по токенам против накладных расходов на хранение, CPU на merge и необходимости заранее спроектировать поля и анализаторы.
Чеклист:
- Определите отображение термин → postings list.
- Объясните boolean/phrase через пересечение списков.
- Свяжите сегменты, merge и refresh с видимостью в поиске.
- Сравните с прямым сканом документов и B-tree equality.
- Отметьте, что scoring использует частоту термина в postings.