fix: kurum adi basligi eziyordu (gida ihalesi 'Hastanesi' yuzunden Saglik) — parcalar oncelik sirasiyla taraniyor

This commit is contained in:
2026-08-30 02:05:01 +03:00
parent 80bb4bc6c4
commit d9ca8a5b52
3 changed files with 22 additions and 8 deletions
+2 -2
View File
@@ -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 */ }
+5 -4
View File
@@ -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.
+15 -2
View File
@@ -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';
}
/**