feat(search): нечёткий поиск по сообщениям — по началу слова и по подстроке
Поиск требовал ввести слово целиком. Теперь: - FTS5 ищет по началу слова: «пр» находит «Привет» (последнее слово запроса получает префикс), регистр не важен; - добавлена нормализованная копия текста (`messages.content_lower`, миграция 00007): подстрочные совпадения ищутся через LIKE без учёта регистра, включая кириллицу (SQLite lower() её не приводит — регистр опускает приложение); - при старте индекс дополняется у старых сообщений (порциями по 500); - результаты FTS и LIKE объединяются без дублей, сортировка по новизне; - тест: «пр» и «ивет» находят все три сообщения с «Привет/приветствие/ПРИВЕТ», посторонний текст не попадает.
This commit is contained in:
@@ -152,6 +152,14 @@ func run() error {
|
||||
// Один калькулятор прав на процесс: HTTP-ручки и Gateway видят общий кэш.
|
||||
calculator := permissions.NewCalculator(source.New(st))
|
||||
gatewayService := gateway.New(st, authService, gateway.NewSnapshot(st, calculator), logger, cfg.AllowedOrigins())
|
||||
// Один раз при старте дополняем индекс поиска у старых сообщений
|
||||
// (кириллица в SQLite lower() не приводится, нормализуем в приложении).
|
||||
if updated, err := st.BackfillSearchIndex(ctx, 500); err != nil {
|
||||
logger.WarnContext(ctx, "backfill search index failed", slog.Any("error", err))
|
||||
} else if updated > 0 {
|
||||
logger.InfoContext(ctx, "search index backfilled", slog.Int("messages", updated))
|
||||
}
|
||||
|
||||
srv := server.New(cfg, db, logger, server.Deps{
|
||||
Store: st, Auth: authService, Gateway: gatewayService, Permissions: calculator,
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user