#4 Карточка дома показывала cross-площадочные дубли (Искровцев 33: 2 квартиры = 4 строки avito/domklik/cian). build_listings_query теперь дедуплит по сигнатуре (rooms, round(area_m2), floor) — как v_building_sale_share мигр.148 — одна строка на квартиру, представитель = самый дешёвый, +колонка sources[] (площадки). Гео-фильтр ≤300м (мигр.150) сохранён. +BuildingListing.sources в схеме. P4a Мигр.151: DELETE 6338/21720 голых алиасов house_address_aliases (без номера дома) — сток, в который сваливались безномерные листинги (Tier-2b). Матчер уже захардненен (P1 #2082), голые не регенерируют. Алиасы — регенерируемый кэш, house_id_fk/house_sources не тронуты. ruff clean, pytest test_buildings_api 26 green.
35 lines
2.9 KiB
PL/PgSQL
35 lines
2.9 KiB
PL/PgSQL
-- 151_clean_bare_street_aliases.sql
|
||
--
|
||
-- CONTEXT: house_address_aliases — кэш матчинга листинг→дом (normalized_address → house_id).
|
||
-- 6338 из 21720 (29%) алиасов — «голые улицы» БЕЗ номера дома (normalized_address вида
|
||
-- «екатеринбург улица мамина сибиряка»). Любой безномерный листинг (Яндекс-SERP часто без
|
||
-- номера дома) матчился в такой алиас (Tier-2b match в matching/houses.py) → сваливание
|
||
-- ЧУЖИХ листингов в один дом (прод: house 131237 «Мамина-Сибиряка 126» стянул 8 разных
|
||
-- Мамина-номеров + голую улицу → ложная доля). Матчер захардненен (P1, PR #2082): больше
|
||
-- НЕ создаёт и НЕ матчит голые алиасы. Эта миграция удаляет УЖЕ НАКОПЛЕННЫЙ сток.
|
||
--
|
||
-- WHAT: DELETE алиасов без хвостового номера дома (последний токен начинается с цифры).
|
||
-- KEEP: «улица вайнера 66», «мамина сибиряка 126а», «улица 8 марта 5» (номер дома есть).
|
||
-- DELETE: «улица мамина сибиряка», «улица 8 марта» (цифра в НАЗВАНИИ улицы, не номер дома).
|
||
-- Регэксп идентичен Python-хелперу has_house_number ('(?:^|\s)\d\S*$', PR #2082).
|
||
--
|
||
-- SAFETY / IDEMPOTENCY: house_address_aliases — РЕГЕНЕРИРУЕМЫЙ кэш матчинга; матчер
|
||
-- пересоздаёт корректные (номерные) алиасы на следующем матче. DELETE НЕ трогает
|
||
-- listings.house_id_fk, house_sources, houses — только кэш-таблицу алиасов. Повторный
|
||
-- прогон удалит 0 (предикат стабилен). Таблица ~21.7k строк → DELETE мгновенный, без
|
||
-- длинных локов. Деплой-раннер гонит файл через psql -v ON_ERROR_STOP=on БЕЗ
|
||
-- --single-transaction → транзакцию открывает САМ файл (BEGIN/COMMIT ниже).
|
||
--
|
||
-- DEPENDENCIES: PR #2082 (P1-гард в matching/houses.py уже в проде — голые алиасы не
|
||
-- регенерируют после удаления). house_address_aliases.normalized_address (мигр. cross-source
|
||
-- matching). NB нумерации: последний занятый = 150; следующий sequential = 151
|
||
-- (`ls tradein-mvp/backend/data/sql | grep '^15'` + открытые PR — дубля basename нет).
|
||
--
|
||
-- Deploy order: после 150_sale_share_listing_geo_filter.sql.
|
||
|
||
BEGIN;
|
||
|
||
DELETE FROM house_address_aliases
|
||
WHERE normalized_address !~ '(^|[[:space:]])[0-9][^[:space:]]*$';
|
||
|
||
COMMIT;
|