> Сколько букв нужно для поиска в индексе (Go)

Уровень: middle · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Wildberries

Стек: Go

> Пример ответа

Короткий ответ

Минимальное количество букв для поиска в индексе зависит от типа индекса и задачи. Для полнотекстового поиска обычно используют префиксный поиск от 2-3 символов, для B-tree индекса - любой префикс, но эффективность растёт с длиной. В Go с полнотекстовыми движками (например, Bleve) минимальная длина токена настраивается через анализатор. Практическое правило: 2-3 символа - разумный минимум, чтобы балансировать между релевантностью и производительностью.

Подробное объяснение

Ключевой фактор - тип индекса:

  • B-tree / LSM-tree (обычные БД): поиск по префиксу работает с любого количества символов, но чем короче префикс, тем больше записей попадает в диапазон сканирования. С точки зрения алгоритма, даже 1 символ корректен, но неэффективен.
  • Inverted index (полнотекстовый поиск): токенизация разбивает текст на термы. Минимальная длина терма задаётся в анализаторе (например, minGram в n-gram индексах). Если задать 1 - индекс раздувается, если 5 - теряются короткие слова.
  • Trigram / n-gram индексы: для нечёткого поиска обычно используют 3-граммы (PostgreSQL pg_trgm, Elasticsearch ngram). Тогда минимальный запрос - 3 символа, иначе индекс не используется.

Для Go-приложений важно: если вы используете database/sql с обычным LIKE 'prefix%', то индекс B-tree сработает на любом префиксе. Но если вы строите собственный in-memory индекс (например, map + сортировка), то минимальная длина - это ваш собственный trade-off между памятью и скоростью.

На практике

  • Для поиска по названиям товаров: минимум 2 символа, чтобы не выдавать тысячи результатов на "а".
  • Для поиска по email или ID: полное значение или минимум 4-5 символов, иначе коллизии.
  • Для кириллицы: 2 символа часто недостаточно из-за окончаний, лучше 3.
  • В полнотекстовых движках (Bleve, Elasticsearch) настройка min_gram / min_token_length напрямую определяет ответ.

Пример кода

GO
// Пример настройки минимальной длины токена в Bleve
import (
"github.com/blevesearch/bleve/v2"
"github.com/blevesearch/bleve/v2/analysis/analyzer/custom"
"github.com/blevesearch/bleve/v2/analysis/token/lowercase"
"github.com/blevesearch/bleve/v2/analysis/tokenizer/unicode"
"github.com/blevesearch/bleve/v2/analysis/token/ngram"
)
func createIndex() (bleve.Index, error) {
ngramTokenFilter := map[string]interface{}{
"type": ngram.Name,
"min": 2.0, // минимальная длина - 2 символа
"max": 5.0,
}
customAnalyzer := map[string]interface{}{
"type": custom.Name,
"tokenizer": unicode.Name,
"token_filters": []string{lowercase.Name, "ngram_filter"},
}
mapping := bleve.NewIndexMapping()
mapping.AddCustomTokenFilter("ngram_filter", ngramTokenFilter)
mapping.AddCustomAnalyzer("custom_analyzer", customAnalyzer)
return bleve.NewMemOnly(mapping)
}

Как отвечать на собеседовании

Начните с уточнения: "Зависит от типа индекса и сценария". Затем перечислите варианты: B-tree - любой префикс, inverted index - настраивается, n-gram - фиксированный размер. Приведите пример из практики: "Для поиска по названиям я бы выбрал 2-3 символа, потому что...". Если спросят про Go - упомяните, что в стандартной библиотеке нет полнотекстового поиска, поэтому выбор движка (Bleve, zincsearch) определяет поведение. Не углубляйтесь в детали реализации, пока не попросят.

Что проверяет интервьюер

  • Понимание разницы между типами индексов (B-tree vs inverted index).
  • Умение оценивать trade-off между релевантностью и производительностью.
  • Знание, что минимальная длина - это настройка, а не константа.
  • Способность привязать ответ к конкретному стеку (Go, БД, поисковый движок).

Типичные ошибки

  • Ответ "1 буква" без пояснения - показывает непонимание производительности.
  • Смешивание полнотекстового поиска и обычного LIKE - это разные механизмы.
  • Утверждение, что "индекс не работает с короткими запросами" - в B-tree работает, но неэффективно.
  • Игнорирование настройки анализатора в Go-движках - интервьюер может ожидать упоминания min_gram или min_token_length.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью