From 8ae98a95007d1410b382b62f6d2f00fd3f9fe52d Mon Sep 17 00:00:00 2001 From: mstfyldz Date: Fri, 14 Aug 2026 12:12:19 +0300 Subject: [PATCH] feat: smart intent-based precedent re-ranking for beraat/bozma/tazminat outcomes --- src/controllers/precedent.controller.ts | 43 +++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/controllers/precedent.controller.ts b/src/controllers/precedent.controller.ts index 8bfff6b..b0d32e0 100644 --- a/src/controllers/precedent.controller.ts +++ b/src/controllers/precedent.controller.ts @@ -61,6 +61,49 @@ SADECE anahtar kelimeleri aralarına boşluk koyarak yaz. Noktalama işareti, a } const data = await mcpResponse.json(); + + // Hukuki niyet ve sonuç (örn. beraat, bozma) odaklı akıllı yeniden sıralama ve puanlama + let rawItems: any[] = data.decisions || data.results || data.data || data.hits || (Array.isArray(data) ? data : []); + + if (Array.isArray(rawItems) && rawItems.length > 0) { + const searchTerms = phrase.toLowerCase().split(/\s+/).filter(Boolean); + const outcomeTerms = ['beraat', 'mahkumiyet', 'bozma', 'onanma', 'tazminat', 'tahliye', 'kabul', 'red', 'ispat', 'zamanaşımı']; + const targetOutcomes = searchTerms.filter((t: string) => outcomeTerms.some(o => t.includes(o))); + + const scoredItems = rawItems.map((item: any) => { + const text = (item.ozet || item.kararMetni || item.summary || item.content || item.title || item.konu || item.birimAdi || '').toLowerCase(); + + let baseScore = 70; + + // 1. Arama terimlerinin metindeki kapsama oranı + const matchCount = searchTerms.filter((term: string) => text.includes(term)).length; + const matchRatio = searchTerms.length > 0 ? matchCount / searchTerms.length : 1; + baseScore += Math.round(matchRatio * 15); + + // 2. Kullanıcının aradığı net netice/karar türü terimleri var mı? (Örn. beraat) + if (targetOutcomes.length > 0) { + const hasTargetOutcome = targetOutcomes.some((outcome: string) => text.includes(outcome)); + if (hasTargetOutcome) { + baseScore += 18; + } else { + baseScore -= 25; // Eğer beraat arayıp kararda beraat geçmiyorsa (örn sadece onanması varsa) sırayı düşür + } + } + + // Skor 45 - 98 arasında sınırlandırılır + const finalScore = Math.max(45, Math.min(98, baseScore)); + return { ...item, relevanceScore: finalScore, score: finalScore }; + }); + + // En yüksek alakaya göre yeniden sırala + scoredItems.sort((a: any, b: any) => b.relevanceScore - a.relevanceScore); + + if (data.results) data.results = scoredItems; + else if (data.decisions) data.decisions = scoredItems; + else if (data.data) data.data = scoredItems; + else if (Array.isArray(data)) data = scoredItems; + } + res.json(data); } catch (error: any) { console.error('Search Precedents Error:', error);