gendesign/tradein-mvp/backend/data/sql/151_clean_bare_street_aliases.sql
bot-backend b105e0a500
All checks were successful
CI / changes (pull_request) Successful in 8s
CI / frontend-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
fix(tradein/sale-share): дедуп карточки листингов + чистка голых алиасов
#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.
2026-06-29 00:22:20 +03:00

35 lines
2.9 KiB
PL/PgSQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 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;