feat: doküman metninden sektör zenginleştirme — başlığı sinyalsiz ilanlar ilan metninden sınıflandırılıyor (kalıcı önbellekli)

This commit is contained in:
2026-08-30 01:39:46 +03:00
parent a6a421d745
commit 495118ef9e
2 changed files with 164 additions and 1 deletions
+84
View File
@@ -50,6 +50,13 @@ CREATE INDEX IF NOT EXISTS idx_idare ON sonuclar(idare_adi);
CREATE INDEX IF NOT EXISTS idx_il ON sonuclar(il);
CREATE INDEX IF NOT EXISTS idx_tarih ON sonuclar(ihale_tarihi);
CREATE TABLE IF NOT EXISTS sektor_zengin (
ilan_id TEXT PRIMARY KEY, -- ör. ilan-12345
sektor TEXT NOT NULL, -- doküman metninden çıkarılan sektör
kaynak TEXT, -- 'dokuman' | 'okas'
zaman TEXT
);
CREATE TABLE IF NOT EXISTS havuz_olcum (
id INTEGER PRIMARY KEY AUTOINCREMENT,
zaman TEXT NOT NULL,
@@ -416,3 +423,80 @@ export function havuzOzet() {
db.close();
}
}
// --- Sektör zenginleştirme (doküman metninden) -----------------------------
// Başlığı sinyalsiz ihaleler ("MUHTELİF MALZEME ALIMI") ilan metninden
// sınıflandırılır. Sonuç kalıcı saklanır: aynı ilan bir daha indirilmez.
/** id → sektör haritası. Yalnızca istenen id'ler okunur. */
export function sektorZenginOku(idler) {
const db = openDb();
if (!db || !idler?.length) return new Map();
try {
const harita = new Map();
// SQLite parametre sınırına takılmamak için parçalara böl.
for (let i = 0; i < idler.length; i += 400) {
const parca = idler.slice(i, i + 400);
const yer = parca.map(() => '?').join(',');
const satirlar = db
.prepare(`SELECT ilan_id, sektor FROM sektor_zengin WHERE ilan_id IN (${yer})`)
.all(...parca);
for (const r of satirlar) harita.set(r.ilan_id, r.sektor);
}
return harita;
} finally {
db.close();
}
}
export function sektorZenginYaz(kayitlar) {
const db = openDb({ create: true });
if (!db || !kayitlar?.length) return 0;
try {
const st = db.prepare(
`INSERT INTO sektor_zengin (ilan_id, sektor, kaynak, zaman) VALUES (?,?,?,?)
ON CONFLICT(ilan_id) DO UPDATE SET sektor=excluded.sektor, kaynak=excluded.kaynak, zaman=excluded.zaman`
);
const now = new Date().toISOString();
let n = 0;
for (const k of kayitlar) {
if (!k?.id || !k?.sektor) continue;
st.run(k.id, k.sektor, k.kaynak || 'dokuman', now);
n++;
}
return n;
} finally {
db.close();
}
}
/** Hangi id'ler daha önce denenmiş? ('Genel' kaydı da denenmiş sayılır) */
export function sektorZenginDenenmis(idler) {
const db = openDb();
if (!db || !idler?.length) return new Set();
try {
const küme = new Set();
for (let i = 0; i < idler.length; i += 400) {
const parca = idler.slice(i, i + 400);
const yer = parca.map(() => '?').join(',');
for (const r of db.prepare(`SELECT ilan_id FROM sektor_zengin WHERE ilan_id IN (${yer})`).all(...parca))
küme.add(r.ilan_id);
}
return küme;
} finally {
db.close();
}
}
export function sektorZenginSayi() {
const db = openDb();
if (!db) return { toplam: 0, cozulen: 0 };
try {
const t = db.prepare("SELECT COUNT(*) c FROM sektor_zengin").get().c;
const c = db.prepare("SELECT COUNT(*) c FROM sektor_zengin WHERE sektor <> 'Genel'").get().c;
return { toplam: t, cozulen: c };
} finally {
db.close();
}
}