İçeriğe Geç

Mevzuat Anlamlı Arama

GET /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ı

  1. Sorgu, çok dilli Qwen3-Embedding-8B modeliyle 4096 boyutlu vektöre çevrilir (sorgu tarafında modelin instruct ön-eki uygulanır)
  2. Qdrant (vektör) + Postgres FTS (anahtar kelime) paralel olarak çalışır — her biri top-K = max(50, take*3) döner
  3. Sonuçlar RRF (Reciprocal Rank Fusion, k=60) ile birleştirilir
  4. Re-ranking: başlıkta sorgu kelimesi geçen sonuçlara +0.05, aktif filtreyle eşleşen etiket başına +0.10 ek 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ı

  • pageSize 1-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 = true dö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.

Aynı mevzuatın ikinci resmî nüshası (ikiz) listelerde ve sayımlarda yer almaz; detay ucu canonicalDocumentId ile sahibine işaret eder.

Paketler: isPackage ve matchedFile

Sonuçlar /library ile aynı paket alanlarını taşır: isPackage (sonuç bir zip paketi mi) ve matchedFile (sorgu sözcüklerinin hepsinin geçtiği tek paket dosyasının yolu; yoksa null). Kurallar için Mevzuat Kütüphanesi sayfasına bakın. Doğal dilde yazılmış uzun sorgularda bütün sözcüklerin tek bir dosyada geçmesi seyrek olduğundan matchedFile burada çoğunlukla null'dır.

Parametreler

İsimKonumTipZorunluAçıklama
search Query string Evet Arama cümlesi.
institutionType Query integer Hayır Tercih sinyali — InstitutionType enum sayı değeri (1-24). 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.

Yanıtlar

200 — Anlamlı arama sonuçları (top-K=100); pagination.truncated=true ise sınır aşılmıştır. Mülga mevzuat ve aynı kanunun diğer nüshaları geri getirmeden sonra elendiği için bir sayfa pageSize'dan az sonuç içerebilir; pagination.totalCount eleme öncesi sayıdır. 'X-Regvion-Debug-Search: 1' gönderildiyse her sonuç ayrıca debug skor kırılımını taşır.

400 — 'search' parametresi boş veya eksik (VALIDATION_ERROR).