концепції / inverted-index
Інвертований індекс
Структура даних, що розв'язує те, чого не вміють B-tree-індекси: пошук слова всередині рядка. Сама структура — слово → список пар (id документа, позиція); позиції відкривають пошук точних фраз і запити за близькістю слів. Підсумок Віктора: «концептуально це все — решта інженерія» (інвертовані індекси). І саме в інженерії живе його бойова історія: він власноруч написав інвертований індекс над 300 TB даних у продакшені — незмінні поденні індекси, геоатрибути, власна мова запитів із парсером на PEG-граматиці, зберігання в MongoDB і паралельні запити по днях — і виступив про це на KyivJS.
Q&A-продовження несе запропоновану глядачем оптимізацію, яка йому дуже сподобалася: розділити індекс на крихітний файл токенів (токен + байтовий offset/довжина, ~2 MB на 88K токенів — реальні словники рідко перевищують 200–300K токенів, тож він цілком уміщається в пам'яті для бінарного пошуку) плюс сирий бінарний файл постингів, що прибирає накладні витрати base64: 1.3 GB → 938 MB, затримка пошуку 15 мс → 5 мс. Його улюблений наслідок: файл постингів може жити на S3 чи CDN і опитуватися через HTTP Range-запити — serverless-повнотекстовий пошук (Q&A до другої частини). Q&A-випуск додає рамку: інвертований індекс і Є тією ефективною структурою — оптимізації міняють серіалізацію (дельта-стиснення, VByte), а не замінюють її (Q&A №1).
Розібрано у відео
- Навіщо потрібні індекси в базі даних — розберемо на прикладі
представлений як механізм (він же повнотекстовий індекс) для пошуку всередині рядка; анонсований як майбутнє практичне відео
- Як працює повнотекстовий пошук: будуємо інвертований індекс на практиці
збудований наживо на JavaScript: слово → (id документа, позиція), фразові запити і запити за близькістю, бойова історія про 300 TB у продакшені
- Як працює повнотекстовий пошук, частина 2: запитання-відповіді й подальші оптимізації
розділення на файл токенів + бінарні постинги (1.3 GB → 938 MB, 15 мс → 5 мс) і serverless-пошук через S3 Range-запити
- Питання та відповіді №1: чи захистить HTTPS?
міняєш серіалізацію, а не структуру; дельта-стиснення дає більшим індексам поміститися в RAM
Повʼязане
Повнотекстовий пошук — конвеєр довкола структури Стиснення індексу — дельта-кодування і varbyte над posting-списками Map-reduce — як він збудував це без 10–15 GB RAM Індекси баз даних — B-tree-побратим, який він доповнює Base64 — накладні витрати серіалізації, які прибрала оптимізація з частини 2