Delphi Can

Orjinalini görmek için tıklayınız: MS SQL Server - Arama Yaklaşık Değerleri Bulma
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Merhabalar,

SQL Server'da arama işlemi yapılıyor.
Arama da > TORKU ŞEKER aramasını LIKE ile yapınca %TORKU% bulma da sorun yok.

Ama aramayı %KORKU% yaptığımız da veri getirmiyor. Bunu skorlama ile en yakın
sonuçları da gösterecek şekilde nasıl bir sorgu veya işlem yapabiliriz acaba?

Yani  %KORKU% yazılsa bile TORKU şekeri de sonuçlarda göstermesi lazım.

Teşekkürler.

NOT!
DB hali hazırda çalışan farklı bir program DB'si. Ful Text indexleme yapılmamış.


Kolay gelsin.
Aşağıdaki konu başlıklarında nasıl yapılacağı anlatılmış.
SQL Fuzzy Match
DIFFERENCE and SOUNDEX SQL
(17-01-2024, Saat: 16:51)RAD Coder Adlı Kullanıcıdan Alıntı: [ -> ]Aşağıdaki konu başlıklarında nasıl yapılacağı anlatılmış.
SQL Fuzzy Match
DIFFERENCE and SOUNDEX SQL

Merhabalar,

Teşekkürler hocam. Bugün bu işi araştırınca aklım iyice karıştı.
Kodları yorumlayamıyorum Smile Biraz daha bakmaya devam edelim.

Teşekkürler tekrar paylaşımınız için.

Kolay gelsin.
(17-01-2024, Saat: 16:51)RAD Coder Adlı Kullanıcıdan Alıntı: [ -> ]Aşağıdaki konu başlıklarında nasıl yapılacağı anlatılmış.
SQL Fuzzy Match
DIFFERENCE and SOUNDEX SQL

Hocam mümkünse daha basit kullanımı olan bir örnek var mı?
Açıkcası anlayamadım. Koda bakıyorum, o bana bakıyor. Sad

Teşekkürler.
vakt-i seherde soundex alternatifi türkçe uyumlu böyle bişey yazmıştım  bi incelersin.

https://www.delphican.com/showthread.php...ht=soundex
Merhaba,

Ben daha ilkel fakat işlevsel bir yöntem sunmak isterim.
Performans ve dahası tartışmaya açık olmakla birlikte göz ardı edilebilir bir durum olabilirler. Fakat benim önerim mevcuttaki hazır yapılar veya full-text-search gibi işlemlere alternatif olarak halis bir arama yapısını kendimizin oluşturması.

Konuyu okuyunca aklıma gelen ilk şey aramak için gönderilen kelimeyi görece öbeklerine ayırmak oldu. Örneğin "serhatyanalak" aranan kelime olsun ve buna referans olan benzer kayıtlarda gelsin istiyorsak kelimeyi;
s
se
ser
serh

şeklinde uzunluğu boyunca ayırır sonra aynı işlemin tersini yapar;
lak
alak
nalak

şeklinde yine uzunluğu boyunca ayırır en son bu iki sorgu sonucunu birleştirir ve LIKE ile ana sorguya entegre eder aratırız. 
Böylece elimizde tek kelimeden türemiş görece anlamlı bir çok alternatif kelime olmuş olur. 
Bunu daha da insancıllaştırmak istersek bir harf bütününün kelime sayılabilmesi için en az kaç adet yan yana harf olması gerektiğine karar verip hesaba katar ve elimizdeki bu kelime haznesini ona göre filtreleriz. Ben örnek olması açısından 3 olarak baz aldım.

Sonra Bu filtreli kelime haznesini aratır ve istediğimiz sonuçları büyük oranda görmüş oluruz.

Tabiki aranan kelimenin önemi burada büyük. Bu sadece fikir vermesi için bir örnektir. Kelime havuzunu genişletmek sizin elinizde.

[attachment=2542] [attachment=2543]


WITH bolumleme AS (
   SELECT 
       CAST(SUBSTRING('serhatyanalak', 1, 1) AS NVARCHAR(100)) AS bolunen,
       2 AS baslangic

   UNION ALL

   SELECT 
       CAST(bolunen + SUBSTRING('serhatyanalak', baslangic, 1) AS NVARCHAR(100)),
       baslangic + 1 
   FROM
       bolumleme 
   WHERE
       baslangic <= LEN('serhatyanalak')
)
,
bolumleme_tersten AS (
   SELECT 
       CAST(SUBSTRING('serhatyanalak', LEN('serhatyanalak'), 1) AS NVARCHAR(100)) AS bolunen,
       LEN('serhatyanalak') - 1 AS baslangic

   UNION ALL

   SELECT 
       CAST(bolunen + SUBSTRING('serhatyanalak', baslangic, 1) AS NVARCHAR(100)),
       baslangic - 1 
   FROM
       bolumleme_tersten 
   WHERE
       baslangic >= 1
)



SELECT 
DISTINCT sy.*
FROM sy_names sy
JOIN (SELECT q.bolunen
FROM (
   SELECT REVERSE(bolunen) AS bolunen
   FROM bolumleme_tersten
   WHERE LEN(bolunen) > 2

   UNION ALL

   SELECT bolunen
   FROM bolumleme
   WHERE LEN(bolunen) > 2
) q) b ON LEN(b.bolunen) > 2 AND sy.title LIKE '%' + b.bolunen + '%'