fix(tradein/geocoder): фолбэк на локальные houses — часть адресов ЕКБ давала гарантированный ноль аналогов #2891
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2891
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/tradein-geocoder-local-house-fallback"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Проблема
Из аудита 15.08. У 28 из 1084 оценок
lat IS NULL— это гарантированный ноль аналогов, клиент не получает оценку вообще. За последние 30 дней таких 5 из 141.Конкретные адреса: «ул Крестинского, д 49», «ул Онуфриева, д 24», «ул. Хрустальногорская, д. 88/2».
При этом дома есть в локальной таблице
housesс координатами. Промах объясняется расхождением с ГАР: улица там «Начдива Онуфриева», а пользователь пишет «Онуфриева»; дом 49 существует только как «49к1».Что сделано
Последней ступенью
geocode()— после DaData и Nominatim, перед честнымNone— добавлен поиск по локальнымhousesс нормализацией: суффиксное сравнение имени улицы («Онуфриева» находит «Начдива Онуфриева») и достройка корпуса («49» → «49к1»). Результат помечаетсяaddress_refined, признак доведён до ответа оценки.Отдельно: DaData CLEAN отключена на аккаунте и давала
logger.errorна каждый пользовательский запрос — 164 события. Понижено до WARNING один раз за процесс. ERROR должен означать настоящий сбой.Что поймало ревью
Первый круг вернул MAJOR — и по делу.
Номер квартиры подменял номер дома. Извлечение брало последнее число в строке: «ул Педагогическая, д 15, кв 11» давало дом 11 вместо 15, с
confidence='exact', и результат ещё и писался в кеш. То есть оценка считалась бы по чужому зданию — тихо и уверенно. Проверено запуском на реальных строках прода.Починено зачисткой хвоста
кв/оф/пом/лит, причём шире запрошенного: добавленыподъезд/этаж, потому что реальный прод-адрес «Трамвайный переулок, 2к2, подъезд 1, этаж 25, кв. 205» ловится тем же классом ошибки. Корпус при этом не трогается — он часть номера дома.houses— не реестр ЕКБ. 21% строк с координатами лежат вне области, вплоть до Серова и Москвы; проверено запросом. Добавлен фильтр по bbox на строку-кандидат.Догадка про корпус была опасна. По «Начдива Онуфриева, 24» в базе есть 24к1, 24к2 и 24к3 в 250-400 метрах друг от друга — прежняя логика уверенно выбирала к1. Теперь при наличии любого другого корпуса фолбэк честно возвращает
None.Результат больше не кэшируется — координаты в
housesприходят из скрейпленных объявлений и местами расходятся на километр между источниками по одному дому.Второй круг: пять замечаний закрыты, вердикт MINOR.
Что осознанно осталось
Зачистка работает по маркеру, поэтому формы без маркера остаются: «пер Трамвайный, д 2, к 3» (корпус отрезан запятой) и «ул Белинского, д 41 (1-155)» дадут неверный токен. Живого ущерба сейчас нет — все такие адреса в проде резолвятся более ранними ступенями и до фолбэка не доходят. Полное решение требует разбора скобочных диапазонов и запятой перед корпусом; вынесу отдельно, чтобы не раздувать этот PR.
Test plan
None— вhousesреально две разные строки «49к1» с разными координатамиlat IS NULLза неделю должна упасть