Обновить

Комментарии 5

Выглядит отлично, поздравляю от всей души! Для первого проекта — вообще волшебно.

Пара советов:

  1. Топорный поиск через ILIKE на таком объёме данных будет мгновенным, поэтому я бы сначала делал в лоб, и если результатов вернулось достаточно (опечаток нет) — отдавал сразу, а иначе — уже пускался во все тяжкие с GIN

  2. Когда высвободится время — попросите вашего помощника сделать приложение на Flutter, оно будет очень простым, помощник справится, зато с монетизацией будет значительно проще, особенно при наличии английского и арабского из коробки.

Спасибо за тёплые слова и советы!!

По поиску - идея с двухэтапным подходом (ILIKE -> GIN fallback) интересная, и я думал об этом. Реализовал немного иначе: через word_similarity с динамическим порогом — для коротких запросов порог выше (меньше ложных совпадений), для длинных — мягче. Но ваш вариант "сначала точный, потом нечёткий" элегантнее по логике — добавлю в TODO.

По Flutter - у меня уже есть нативное Android-приложение на Kotlin/Compose. Flutter или React Native рассматривал, но остановился на нативе из-за опыта. Хотя для охвата iOS - аргумент весомый, особенно учитывая что арабский и английский уже есть

Попробовал реализовать ваш совет прямо сейчас. Результат - пушка! 🚀 Раньше поиск по слову "рамадан" занимал около 300мс, теперь по логам стабильно 113мс. Огромное спасибо за наводку, это реально упростило логику и ускорило ответ API!

Ну и отлично. Результаты поиска по «рамадан» и всяким «иншалла»/«машалла» я бы вообще кешировал.

Кстати, а вы проверяли поиск «إن شاء الله» / «رمضان»? Там-то какие цифры? (Мне любопытно просто, если честно).

Хороший вопрос про арабский! Я как раз замерил после вашего вопроса: поиск «إن شاء الله» без харакатов(огласовок) занимает около 1.7 сек, в то время как запрос с огласовками отрабатывает за 160-170 мс.

Проблема в том, что Postgres (pg_trgm) тратит колоссальные ресурсы на поиск соответствий, когда в индексированном тексте полно диакритики, а в запросе её нет - триграммы просто не матчатся напрямую. Решение уже в ToDo: добавим в базу отдельную колонку с нормализованным текстом (без харакатов) специально для поиска.

А для всех запросов, у нас уже работает кеширование в Redis на 24 часа, так что после первого "прогрева" они отдаются мгновенно

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации