Клиент — корпоративный сайт на WordPress (услуги B2B, ~800 статей и страниц). Стандартный поиск WP искал только по заголовку и телу «как есть»: синонимы, опечатки и вопросы в свободной форме часто давали пустую выдачу; поддержка получала одни и те же вопросы по почте.
Задача: поиск по смыслу по всей базе материалов — без замены WordPress и без публичного чат-бота. Посетитель видит релевантные фрагменты и ссылки; админ — статистику запросов без ответа.
Реализация:
• Плагин WP: nightly-индексация постов, страниц и CPT через REST API; webhook при публикации/обновлении;
• отдельный сервис (Python/FastAPI): чанкинг текста, embeddings, PostgreSQL + pgvector;
• API /search: запрос → топ-5 фрагментов с score, URL, заголовок, excerpt;
• виджет на фронте (shortcode + Gutenberg-блок): поле «Спросите…», список результатов, fallback на обычный WP Search;
• кэш частых запросов в Redis; rate limit с фронта;
• админ-страница: статус индекса, последняя переиндексация, топ-20 запросов без результатов;
• исключение черновиков и служебных страниц из индекса;
• мобильная вёрстка виджета, lazy-load результатов.
Стек: WordPress, PHP (плагин), JavaScript, Python, FastAPI, pgvector, Redis, cron, Docker. Документация: переиндексация после массового импорта. Приёмка: 30 тестовых запросов сверены с ручной выдачей редактора.
Итог: пользователи находят ответ без подбора ключевых слов; снижение однотипных обращений в поддержку (~25% за два месяца). NDA: домен не публикуется.