Как превратить текстовый запрос в кандидатов для поиска недвижимости
Пользователь пишет свободный текстовый запрос по недвижимости, в котором могут быть частые атрибуты и редкие бытовые детали. Как превратить такой query в кандидатов через structured attributes, полнотекстовый поиск и векторный поиск?
Ответить самому
Сначала сформулируйте ответ как на собеседовании, затем откройте разбор и оцените себя.
Короткий ответ
Для частых и точных ограничений лучше извлекать атрибуты из query и искать по structured/full-text индексу. Для редких или мягких формулировок нужен vector search по описаниям/чанкам и, возможно, изображениям. Кандидатов из разных источников объединяем и передаем в ranker с признаками provenance.
Полный разбор
Не стоит сводить все к одному embedding search. Для частых и важных ограничений - город, район, цена, комнаты, тип аренды, наличие техники, метро - полезен query parser, который превращает текст в атрибуты. Эти атрибуты можно матчить со структурными полями объявлений и full-text индексом.
Для long-tail формулировок, где нет заранее заведенного признака, нужен dense/vector retrieval. Описание объявления можно разбивать на чанки и строить embeddings, чтобы запросы вроде "тихая квартира рядом с парком" доставали релевантные объявления даже без точного флага. Lexical search все равно нужен для адресов, метро, редких имен и точных совпадений.
Candidate generation лучше делать гибридно: structured filters, BM25/full-text, vector index, freshness/popularity fallback и допустимые paid listings. В ranker нужно передавать provenance: откуда пришел кандидат и по каким признакам он совпал. Это помогает debug, объяснениям и контролю paid/organic баланса.
Теория
Hybrid retrieval нужен потому, что structured matching, lexical search и embeddings ошибаются на разных типах запросов.
Типичные ошибки
- Заменить все фильтры одним opaque embedding search.
- Потерять точные geo/address/entity совпадения.
- Не передать в ranker признаки источника кандидата.
Как отвечать на собеседовании
- Скажите: query parser плюс full-text плюс dense retrieval.
- Отдельно назовите long-tail атрибуты и candidate provenance.