Mevzuat Anlamlı Arama
/api/v1/library/semantic
Mevzuat Anlamlı Arama
Cümle veya soru bazlı, niyet temelli mevzuat aramasıdır. Anahtar kelime eşleşmesi yerine vektör benzerliği + tam metin füzyonu kullanır; bu nedenle "müşteri şikayetlerinin yönetim süreci" gibi günlük dilde ifadelere doğal yanıt verir.
Hibrit boru hattı
- Sorgu, çok dilli Qwen3-Embedding-8B modeliyle 4096 boyutlu vektöre çevrilir (sorgu tarafında modelin instruct ön-eki uygulanır)
- Qdrant (vektör) + Postgres FTS (anahtar kelime) paralel olarak çalışır — her biri top-K =
max(50, take*3)döner - Sonuçlar RRF (Reciprocal Rank Fusion, k=60) ile birleştirilir
- Re-ranking: başlıkta sorgu kelimesi geçen sonuçlara
+0.05, aktif filtreyle eşleşen etiket başına+0.10ek puan eklenir
Filtreler tercih sinyalidir
institutionType, topic, department parametreleri eleme yapmaz — sadece sıralamada öne çekme/aşağı itme sinyali olarak kullanılır. Yani filtreyle eşleşmeyen sonuçlar yine listelenir, daha alta düşer. Bu davranış, anlamlı arama sonuçlarının çok dar bir filtre yüzünden tamamen kaybolmasını engeller.
/library (anahtar kelime) ile farkını burada vurgulamak gerek: orada filtreler sert filtredir; burada yumuşak sinyaldir.
Ancak bu yumuşaklık yalnızca institutionType / topic / department için geçerlidir. Uç nokta, geri getirmeden sonra iki sert eleme uygular: mülga mevzuatı koşulsuz eler (/library'deki legalStatus=all karşılığı burada yoktur) ve aynı kanunun farklı kaynaklardaki nüshalarını tek satıra indirir. Bu nedenle bir sayfa pageSize'dan az sonuç içerebilir; pagination.totalCount eleme öncesi sayıdır.
Hata ve hata ayıklama
search parametresi boş veya eksik gönderilirse uç nokta 400 VALIDATION_ERROR döner.
İsteğe X-Regvion-Debug-Search: 1 başlığını eklerseniz her sonuç ayrıca bir debug nesnesi taşır: semantic, keyword, titleBoost, tagBoost ve rrfRank. Başlık gönderilmezse bu alan null döner.
Sayfalama ve top-K sınırı
pageSize1-50 arası (varsayılan 12)- Toplam top-K = 100 ile sınırlıdır; bunun ötesi sıralama gürültüsüdür
pagination.truncated = truedöndüğünde, sınır aşıldığı için daha fazla sayfa istemenin manası yoktur
/library ile karşılaştırma
| Özellik | /library (anahtar kelime) |
/library/semantic (anlamlı) |
|---|---|---|
| Sorgu yapısı | Token bazlı | Cümle/soru bazlı |
| Filtre davranışı | Sert (eler) | Etiket filtreleri yumuşak (sinyal); mülga elemesi ve nüsha daraltması serttir |
| Eşleşme | Postgres FTS (Türkçe kök + aksan duyarsız) + başlıkta ILIKE yedeği | Vektör benzerliği + FTS füzyonu (RRF) |
pageSize üst sınırı |
100 | 50 |
| Sıralama | sort ile seçilir: date_desc / date_asc / title_asc / title_desc / relevance |
Sabit — relevance |
| Snippet | <b> highlight, FTS headline |
<b> highlight, kelime tabanlı |
obligationCount |
Gerçek yükümlülük sayısı | Her zaman 0 — bu uçta doldurulmaz; sayı için /library/{id}/obligations |
Listeleme veya filtreleme önceliğiniz varsa /library'yi, doğal dille soru sorduğunuzda /library/semantic'i tercih edin.
Parametreler
| İsim | Konum | Tip | Zorunlu | Açıklama |
|---|---|---|---|---|
search |
Query | string |
Evet | Arama cümlesi. |
institutionType |
Query | integer |
Hayır | Tercih sinyali — InstitutionType enum sayı değeri (1-22). Sonuçları dışlamaz, yeniden sıralar. |
topic |
Query | integer |
Hayır | Tercih sinyali — TopicType enum sayı değeri (1-25). |
department |
Query | integer |
Hayır | Tercih sinyali — DepartmentType enum sayı değeri (1-24). |
page |
Query | integer |
Hayır | Sayfa numarası. |
pageSize |
Query | integer |
Hayır | 1-50; varsayılan 12. |
X-Regvion-Debug-Search |
Header | string |
Hayır | '1' gönderildiğinde her sonuca skor kırılımı eklenir: debug = { semantic, keyword, titleBoost, tagBoost, rrfRank }. Gönderilmezse bu alan null döner. |