Обновить

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

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

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

  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 часа, так что после первого "прогрева" они отдаются мгновенно

крутой проект!
Один совет: посмотри в сторону Meilisearch вместо pg_trgm. У тебя 15к записей и уже 2 ГБ на индексах, а поиск все равно больше секунды. Meilisearch из коробки дает fuzzy search за миллисекунды и с арабским работает нормально.

спасибо за наводку! Про Meilisearch слышал, но пока руки не доходили, и думал сложно настроить. Обязательно посмотрю в сторону нормального поискового движка, тем более если там из коробки арабский и такая скорость и добавлю в ToDo

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

Публикации