diff --git a/tradein-mvp/backend/app/services/estimator.py b/tradein-mvp/backend/app/services/estimator.py index 743a333b..d319891b 100644 --- a/tradein-mvp/backend/app/services/estimator.py +++ b/tradein-mvp/backend/app/services/estimator.py @@ -5,7 +5,8 @@ Алгоритм: 1. Geocode address → (lat, lon) 2. SELECT listings с фильтрами: - - PostGIS ST_DWithin (geom, point, 800m) — радиус поиска + - PostGIS ST_DWithin (geom, point, 1000m) — радиус поиска + - source ≠ avito (у Avito фейковые anchor-jitter координаты — не гео-аналог) - rooms = target_rooms (точное совпадение) - area_m2 BETWEEN target × 0.85 AND target × 1.15 - scraped_at > NOW() - 14 days (свежие) @@ -362,6 +363,12 @@ def _fetch_analogs( AND is_active = true AND scraped_at > NOW() - (:fresh_days || ' days')::interval AND price_rub > 0 + -- Avito исключён из радиусного поиска: его «координаты» — это + -- якорь cron-скрейпа ± jitter (DOM Avito реальных coords не + -- отдаёт). Фейковые точки кучкуются на 5 якорях и вытесняют + -- реальные cian/yandex/n1 — оценка считалась почти целиком по + -- Avito. Реальные источники дают честный гео-радиус. + AND source <> 'avito' ORDER BY ( -- distance_m — это SELECT-алиас. В ORDER BY-ВЫРАЖЕНИИ (не голым -- термом) PostgreSQL трактует имя как входную колонку listings,