feat(tradein): бэкфилл координат листингов из ekb_geoportal_buildings (street+house match) #1841

Merged
lekss361 merged 1 commit from feat/tradein-backfill-coords-geoportal into main 2026-06-20 14:14:13 +00:00
Owner

Зачем

Много листингов с lat IS NULL (геокод не отработал). Теперь есть полный реестр зданий ЕКБ (ekb_geoportal_buildings, 34735) — можно проставить координаты джоином по адресу. Не-ЕКБ листинги не сматчатся (другой город) → останутся без координат (корректно: radius-фильтр оценки их не берёт = заодно не тянет padding-мусор в комплы).

Что — задача app/tasks/backfill_listings_coords_geoportal.py

backfill_coords_from_geoportal(db, *, limit=None, sources=None, batch_size=500) -> BackfillCoordsResult
  • SELECT кандидатов lat IS NULL (ЕКБ-скоуп) батчами.
  • Парс адреса: переиспользован geocoder._parse_street_house (обрабатывает «г. Екатеринбург, ул. Малышева, 30, кв. 28» → street/house, чистит кв./корпус) + матч через geocoder._geoportal_house_match (нормализация street_norm/house_norm как в ingest).
  • Матч → UPDATE listings SET lat, lon, geom=ST_SetSRID(ST_MakePoint(CAST(:lon AS double precision),CAST(:lat AS double precision)),4326) WHERE id=:id AND lat IS NULL. psycopg v3, CAST-форма.
  • Идемпотентно (WHERE lat IS NULL — повтор не трогает заполненные), commit батчами, лог кандидаты/сматчено/обновлено/без-матча.

Запуск (после деплоя)

python -m app.tasks.backfill_listings_coords_geoportal               # весь backlog
python -m app.tasks.backfill_listings_coords_geoportal --limit 5000
python -m app.tasks.backfill_listings_coords_geoportal --sources avito cian

Тесты

  • 11 unit (tests/tasks/test_backfill_listings_coords_geoportal.py): матч→coords, без-матча→skip, уже-с-координатами→skip, идемпотентность WHERE lat IS NULL.
  • Полный pytest: pass; 2 pre-existing fails (cian cache, search auth) не относятся.
  • ruff green.

⚠️ Это runnable-таска (не авто-расписание). Запущу вручную после деплоя. Связано: #1786 (геопортал), аудит скрапперов 2026-06-20.

## Зачем Много листингов с `lat IS NULL` (геокод не отработал). Теперь есть полный реестр зданий ЕКБ (`ekb_geoportal_buildings`, 34735) — можно проставить координаты джоином по адресу. Не-ЕКБ листинги не сматчатся (другой город) → останутся без координат (корректно: radius-фильтр оценки их не берёт = заодно не тянет padding-мусор в комплы). ## Что — задача `app/tasks/backfill_listings_coords_geoportal.py` ```python backfill_coords_from_geoportal(db, *, limit=None, sources=None, batch_size=500) -> BackfillCoordsResult ``` - SELECT кандидатов `lat IS NULL` (ЕКБ-скоуп) батчами. - Парс адреса: переиспользован `geocoder._parse_street_house` (обрабатывает «г. Екатеринбург, ул. Малышева, 30, кв. 28» → street/house, чистит кв./корпус) + матч через `geocoder._geoportal_house_match` (нормализация street_norm/house_norm как в ingest). - Матч → `UPDATE listings SET lat, lon, geom=ST_SetSRID(ST_MakePoint(CAST(:lon AS double precision),CAST(:lat AS double precision)),4326) WHERE id=:id AND lat IS NULL`. psycopg v3, CAST-форма. - Идемпотентно (`WHERE lat IS NULL` — повтор не трогает заполненные), commit батчами, лог кандидаты/сматчено/обновлено/без-матча. ## Запуск (после деплоя) ``` python -m app.tasks.backfill_listings_coords_geoportal # весь backlog python -m app.tasks.backfill_listings_coords_geoportal --limit 5000 python -m app.tasks.backfill_listings_coords_geoportal --sources avito cian ``` ## Тесты - 11 unit (`tests/tasks/test_backfill_listings_coords_geoportal.py`): матч→coords, без-матча→skip, уже-с-координатами→skip, идемпотентность `WHERE lat IS NULL`. - Полный pytest: pass; 2 pre-existing fails (cian cache, search auth) не относятся. - ruff green. ⚠️ Это runnable-таска (не авто-расписание). Запущу вручную после деплоя. Связано: #1786 (геопортал), аудит скрапперов 2026-06-20.
lekss361 added 1 commit 2026-06-20 14:09:34 +00:00
feat(tradein): бэкфилл координат листингов из ekb_geoportal_buildings (street+house match)
All checks were successful
CI / changes (pull_request) Successful in 6s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
d35e61be16
lekss361 merged commit 06fa5b4910 into main 2026-06-20 14:14:13 +00:00
lekss361 deleted branch feat/tradein-backfill-coords-geoportal 2026-06-20 14:14:13 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1841
No description provided.