From 8bef0fd872b89a30c84da0d62bc8ae07d21f64c9 Mon Sep 17 00:00:00 2001 From: Light1YT Date: Fri, 22 May 2026 14:26:29 +0500 Subject: [PATCH] =?UTF-8?q?fix(tradein):=20=D0=BE=D1=86=D0=B5=D0=BD=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B8=D1=81=D0=BA=D0=BB=D1=8E=D1=87=D0=B0=D0=B5=D1=82?= =?UTF-8?q?=20Avito=20=D0=B8=D0=B7=20=D1=80=D0=B0=D0=B4=D0=B8=D1=83=D1=81?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=B0=D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit У Avito-объявлений «координаты» = якорь cron-скрейпа ± jitter (DOM Avito реальных coords не отдаёт). Фейковые точки кучкуются плотными кластерами на 5 якорях ЕКБ — tier-1 радиус (1 км) набирался почти целиком из них: оценка для центра давала sources_used=['avito'], 18 аналогов все Avito, при 1400 живых cian/yandex/n1 в БД. _fetch_analogs теперь исключает source='avito'. Трёхтирный fallback по радиусу доходит до реальных cian/yandex/n1 с настоящей геопривязкой — оценка считается по корректным аналогам. --- tradein-mvp/backend/app/services/estimator.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) 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,