Найти в Дзене
Цифровая Переплавка

Zoekt: триграммный ускоритель по коду и почему старый добрый поиск внезапно стал высокотехнологичным

Когда инженеры говорят о поиске по коду, большинство представляет себе что-то на уровне grep -R или встроенный поиск IDE. Но в мире, где репозитории легко достигают миллионов строк, а компания имеет тысячи Git-проектов, эти инструменты становятся узким горлышком. И здесь появляется Zoekt — минималистичный, но очень инженерный проект от Sourcegraph, который делает одну вещь исключительно хорошо: очень быстрый поиск по исходному коду. Его архитектура показывает удивительную вещь: правильно выбранный базовый алгоритм способен конкурировать с куда более «навороченными» ML-решениями там, где важна скорость и предсказуемость, а не семантика. 🔍 Почему обычный поиск по коду не справляется Наивный поиск по тексту работает плохо в двух типичных ситуациях: 💥 когда кодовая база огромная (монорепы, петабайты истории, множество веток); 🧩 когда совпадения требуют строгой структурности (символы, регулярки, логические запросы). И дело тут не только в скорости. Классические инструменты: не умеют эфф
Оглавление

Когда инженеры говорят о поиске по коду, большинство представляет себе что-то на уровне grep -R или встроенный поиск IDE. Но в мире, где репозитории легко достигают миллионов строк, а компания имеет тысячи Git-проектов, эти инструменты становятся узким горлышком.

И здесь появляется Zoekt — минималистичный, но очень инженерный проект от Sourcegraph, который делает одну вещь исключительно хорошо: очень быстрый поиск по исходному коду.

Его архитектура показывает удивительную вещь: правильно выбранный базовый алгоритм способен конкурировать с куда более «навороченными» ML-решениями там, где важна скорость и предсказуемость, а не семантика.

🔍 Почему обычный поиск по коду не справляется

Наивный поиск по тексту работает плохо в двух типичных ситуациях:

  • 💥 когда кодовая база огромная (монорепы, петабайты истории, множество веток);
  • 🧩 когда совпадения требуют строгой структурности (символы, регулярки, логические запросы).

И дело тут не только в скорости. Классические инструменты:

  • не умеют эффективно ранжировать результаты,
  • плохо понимают структуру исходников,
  • не работают как распределённые сервисы,
  • не поддерживают многорепозиториальные запросы.

Поэтому Zoekt делает не «улучшенный grep», а поисковый движок уровня Elasticsearch, но специально для кода.

⚙️ В сердце Zoekt — триграммное индексирование

Триграммы (подстроки длины 3) — старый, но чрезвычайно эффективный метод построения полнотекстовых индексов. Zoekt использует его с инженерной точностью:

  • 📦 каждая триграмма → список позиций в файлах;
  • ⚙️ индекс хранится в mmap-совместимом формате, что минимизирует сканирование диска;
  • 🏎️ запуск поиска — это пересечение множества триграмм, что даёт почти мгновенные результаты.

Почему триграммы работают так быстро?

Потому что:

  • они резко уменьшают пространство поиска;
  • создают компактный бинарный индекс;
  • позволяют выполнять логические операции на уровне битовых масок.

Это тот случай, когда классическая идея оказывается идеальной для задач XXI века.

🧠 А что насчёт качества? BM25 и Universal Ctags

Скорость — это полдела. Качество ранжирования тоже критично.

Zoekt суперпрост, но не примитивен:

  • 🧠 поддерживает BM25 — классическую формулу TF/IDF-ранжирования;
  • 🧲 использует символьную информацию (функции, структуры, типы);
  • 🏷️ требует Universal Ctags, чтобы распознавать элементы языка — и умеет пересобирать символный слой быстрее большинства IDE.

В результате поиск по коду становится:

  • не только быстрым,
  • но и релевантным.

Если вы когда-нибудь пытались искать определение функции в кодовой базе без LSP — вы прекрасно понимаете боль.

🧩 Zoekt как сервис: indexserver + webserver = полноценный поисковый кластер

Проект работает в двух режимах:

🛠️ CLI-инструменты

Идеально подходят для локального поиска:

  • zoekt — поиск
  • zoekt-index — индексирование директорий
  • zoekt-git-index — индексирование Git-репозиториев

🏭 Сервисная архитектура

Подходит для компаний и больших команд:

  • indexserver
    подключается к GitHub/GitLab
    скачивает, обновляет, переиндексирует репозитории
    очищает репокэши и логи
  • webserver
    предоставляет UI на localhost:6070
    JSON API
    gRPC API
    потоковая выдача
    BM25
    контекст кода вокруг совпадений

Это превращает Zoekt в поисковую машину уровня Sourcegraph, но без громоздкой инфраструктуры.

🧬 Чему инженеру стоит поучиться у Zoekt

Меня в этом проекте впечатляет не скорость, а инженерная культура, которая стоит за ним.

✨ Уроки Zoekt:

  • 💡 эффективные алгоритмы побеждают магию: триграммы и mmap работают лучше, чем многие ML-подходы в поиске.
  • 🧱 простая архитектура масштабируется лучше сложной: indexserver + webserver легко развернуть, легко поддерживать.
  • 🧰 универсальность не нужна, если задача узкая: Zoekt не пытается быть поиском по всему миру — только по коду.
  • 🚀 оптимизация низкого уровня остаётся актуальной: формат индекса, компрессия, быстрые битовые операции — всё это критично.
  • 🔧 интеграция с экосистемой даёт огромный выигрыш: связка с Universal Ctags делает результаты лучше на порядок.

Создаётся ощущение, что Zoekt — это идеальная иллюстрация принципа:

«Не нужно изобретать ИИ, чтобы ускорить разработку. Иногда достаточно правильно применить компьютерную науку 70-х».

🌟 Личное мнение: Zoekt — лучший пример инженерной элегантности 2020–х

В эпоху, где всё пытаются заменить нейросетями, Zoekt — отрезвляющий пример:

  • маленький код;
  • зрелая математика;
  • продуманная архитектура;
  • высокая скорость;
  • реальная польза.

Это тот случай, когда open-source превосходит корпоративные продукты именно благодаря простоте и глубине проработки деталей.

Для больших компаний и команд Zoekt может стать сердцем инструментария разработчика — или даже основой внутреннего Sourcegraph-аналогa без гигантских затрат.

🔗 Источники