fix(tradein/estimator): дом «2» вместо «15» при глухом названии станции метро в avito-адресе #2429
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
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#2429
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/tradein-dedup-2423-avito-metro-glue"
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?
Summary
Продолжение #2291 — новый класс остаточных кросс-source дублей (#2423, найден при live-перезамере PR #2417): ~244 из 434 survivor-групп на текущем денаминаторе.
Root cause: некоторые avito-адреса приклеивают название ближайшей станции метро к номеру дома без разделителя (
"ул. Амундсена, 2Чкаловская11-15 мин. пешком"). Кириллическая буква и цифра — оба\wдля\b, поэтому_DEDUP_HOUSE_NO_RE(estimator.py:4954) не находит word-boundary между номером дома и приклеенным словом → trailing\bложно отменял весь матч цифры →.search()сдвигался вправо и захватывал «15» из хвоста «11-15 мин» (расстояние до метро пешком) вместо реального номера дома «2». Дальшеguard_houseв_dedup_cross_sourceкорректно (по своей логике), но на неверных входных данных блокировал слияние с cian/domklik/yandex-версией того же физлота — legit-дубль не схлопывался (under-merge, противоположный риск от over-merge в #2291/PR #2417).Fix: минимальное изменение регекса — суффикс-буква («46г», «8а») засчитывается только если ЗА НЕЙ не идёт ещё один word-символ (
(?!\w), буква ИЛИ цифра — не только буква, см. ниже почему), plus убран лишний trailing\b, который и вызывал ложную отмену матча.Важное отклонение от первоначального дизайна (найдено воркером на шаге full-suite regression run, ДО ревью): буквальная версия из дизайна (
(?![а-яё])— запрет только на ЕЩЁ ОДНУ букву) чинила avito-баг, но ломала приклеенный без пробела корпус-формат"6к1"— он стал даватьhouse="6к", тогда как эквивалент с пробелом"6 к1"(domklik) по-прежнему давалhouse="6"→ два представления ОДНОГО физического адреса начинали расходиться, иguard_houseначинал ошибочно блокировать их слияние (сломал 4 существующих теста). Финальный regex использует(?!\w)(запрет на любой word-символ — букву ИЛИ цифру), что чинит исходный баг И делает"6к1"→house="6", совпадая с"6 к1".Проверено лично (независимо от воркера/ревьюера) — прогнал regex вручную в Python REPL:
2Чкаловская11-15 мин15(баг)2✅24г24г24г(не сломано)32а32а32а(не сломано)12/312/312/3(не сломано)6к1(без пробела)None(пусто)6(улучшение, не регрессия)6 к1(с пробелом)66(совпадает с «6к1» теперь)Test plan
tests/test_estimator_dedup_cross_source_2087.py— 63/63 (9 новых тестов на #2423 + 2 обновлённых пиннинг-кейса на «6к1»), прогнал лично в venvpytest tests/ -k "estimator or dedup or geocoder"— 611 passed / 4 skipped, прогнал лично в venvtest_search_api.py::test_search_cache_hit, подтвержденоgit stash— падает так же на немодифицированном main, auth/env test-isolation, не связано с диффом)Refs #2423, #2291