From d9ca8a5b524ca626c438311ac332ec97000cbbbf Mon Sep 17 00:00:00 2001 From: ht Date: Sun, 30 Aug 2026 02:05:01 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20kurum=20adi=20basligi=20eziyordu=20(gida?= =?UTF-8?q?=20ihalesi=20'Hastanesi'=20yuzunden=20Saglik)=20=E2=80=94=20par?= =?UTF-8?q?calar=20oncelik=20sirasiyla=20taraniyor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/history-store.mjs | 4 ++-- server/index.js | 9 +++++---- server/siniflandir.mjs | 17 +++++++++++++++-- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/server/history-store.mjs b/server/history-store.mjs index d3e1ef7..cd9ac1c 100644 --- a/server/history-store.mjs +++ b/server/history-store.mjs @@ -90,9 +90,9 @@ export function openDb({ create = false } = {}) { db.exec(SCHEMA); // Geçiş: sektör zenginleştirmesi ilanın TAMAMINI tarıyordu ve standart // hukuki metin ("e-imza", "numune sunulması") yanlış sınıflandırma üretiyordu. - // v2 yalnızca işin konusunu tarar; eski kayıtlar silinip yeniden hesaplanır. + // v3: yalnızca işin konusu taranır ve başlık öncelikli; eski kayıtlar silinip yeniden hesaplanır. try { - const silinen = db.prepare("DELETE FROM sektor_zengin WHERE kaynak IS NULL OR kaynak <> 'dokuman-v2'").run(); + const silinen = db.prepare("DELETE FROM sektor_zengin WHERE kaynak IS NULL OR kaynak <> 'dokuman-v3'").run(); if (silinen?.changes) console.log(`[history-store] ${silinen.changes} eski sektör kaydı geçersiz kılındı (v2)`); } catch { /* tablo henüz yoksa sorun değil */ } diff --git a/server/index.js b/server/index.js index 63b2e67..6464dde 100644 --- a/server/index.js +++ b/server/index.js @@ -121,7 +121,7 @@ function mapAd(ad) { const ikn = getFilter(ad, 'İhale Kayıt No') || ad.adNo || ''; const usul = getFilter(ad, 'İhale Usulü') || 'Belirtilmemiş'; const ihaleTuru = getFilter(ad, 'İhale Türü') || ''; - const searchBase = `${ad.title || ''} ${ad.advertiserName || ''}`; + const searchBase = `${ad.title || ''} ${ad.advertiserName || ''}`; // yalnızca arama için const kalanGun = daysUntil(tarih); let aciliyetBadge = null; @@ -143,7 +143,8 @@ function mapAd(ad) { saat: '', alimTuru: ihaleTuru || 'İhale', usul, - sektor: classify(SECTOR_RULES, searchBase, 'Genel'), + // Başlık önce, kurum adı yalnızca yedek (bkz. sektorBul) + sektor: sektorBul(ad.title || '', ad.advertiserName || ''), brans: ihaleTuru || 'Genel', kurumTipi: classify(INSTITUTION_RULES, ad.advertiserName || '', 'Diğer Kamu Kurumları'), eklenmeZamani: relativeTimeTr(ad.publishStartDate), @@ -338,10 +339,10 @@ async function sektorZenginlestir() { // hukuki metin ("e-imza ile imzalanarak", "numune sunulması") // sınıflandırmayı zehirliyordu. const sek = sektorBul(t.baslik || '', ilanKonusu(det.aciklama || '')); - sonuc.push({ id: t.id, sektor: sek, kaynak: 'dokuman-v2' }); + sonuc.push({ id: t.id, sektor: sek, kaynak: 'dokuman-v3' }); } catch (e) { // Metin alınamadıysa 'Genel' yaz — sonsuz yeniden deneme olmasın. - sonuc.push({ id: t.id, sektor: 'Genel', kaynak: 'dokuman-v2' }); + sonuc.push({ id: t.id, sektor: 'Genel', kaynak: 'dokuman-v3' }); } })); // Kaynağı yormamak için gruplar arasında kısa duraklama. diff --git a/server/siniflandir.mjs b/server/siniflandir.mjs index 77a55c6..0bdc3f8 100644 --- a/server/siniflandir.mjs +++ b/server/siniflandir.mjs @@ -222,9 +222,22 @@ export function classify(rules, text, fallback) { return fallback; } -/** İhale metninden sektör. Kaynak ne olursa olsun aynı sonucu verir. */ +/** + * İhale metninden sektör. Parçalar ÖNCELİK sırasına göre TEK TEK denenir. + * + * Hepsini birleştirip taramak yanlış sonuç verir: kural sırası metin içindeki + * konumu ezer. "Gıda ürünleri alınacaktır" + "X DEVLET HASTANESİ" birleştirilirse + * Sağlık kuralı (1. sıra) Gıda kuralından (4. sıra) önce eşleşir ve gıda ihalesi + * Sağlık görünür. Bu yüzden önce başlığa bakarız; ancak başlık sessizse + * yardımcı metinlere (kalem adları, ilan konusu, kurum adı) düşeriz. + */ export function sektorBul(...parcalar) { - return classify(SECTOR_RULES, parcalar.filter(Boolean).join(' '), 'Genel'); + for (const p of parcalar) { + if (!p) continue; + const s = classify(SECTOR_RULES, p, null); + if (s) return s; + } + return 'Genel'; } /**