Комментарии 5
Выглядит отлично, поздравляю от всей души! Для первого проекта — вообще волшебно.
Пара советов:
Топорный поиск через
ILIKEна таком объёме данных будет мгновенным, поэтому я бы сначала делал в лоб, и если результатов вернулось достаточно (опечаток нет) — отдавал сразу, а иначе — уже пускался во все тяжкие с GINКогда высвободится время — попросите вашего помощника сделать приложение на 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 часа, так что после первого "прогрева" они отдаются мгновенно

Парсинг, боль и AI-напарник: Как я в 16 лет строил Open Source API и оптимизировал Postgres