SQL Server’da Tam Metin Arama
Uygulaması: Kapsamlı Bir Kılavuz
Veritabanı sistemleri ile etkileşimde bulunan uygulamalar geliştirirken, sıklıkla karşılaşılan bir zorluk, birden fazla alan boyunca etkili arama yapabilme yeteneğidir. Bu özellikle, kullanıcıların kısmi sorgular ve varyasyonlar temelinde sonuç bulmayı beklediği kişilerin isimleri için geçerlidir. Bu yazıda, SQL Server ile çalışan geliştiricilerin karşılaştığı yaygın bir sorunu ele alacağız: çeşitli sütunlarda isimler için verimli bir tam metin arama uygulamak.
Sorun
Geliştirici, SQL Server Tam Metin Arama kullanarak isimler için arama yaparken tutarsız sonuçlarla karşılaştı. Senaryo, isimler için üç sütunu olan bir tabloyla ilgiliydi: Ad, İkinci Ad ve Soyadı. Kullanıcılar ya tam bir isim ya da ismin kısımlarını girebiliyordu, ancak yalnızca belirli sorgular sonuç veriyordu. Örneğin:
Fry
için yapılan arama “Phillip Fry” için beklenen sonucu döndürüyordu.- Fakat
Phillip Fry
,Fr
veyaPhil
araması yapıldığında, hiçbir sonuç görünmüyordu. Wong
gibi diğer isimlerde de tutarsız davranışlar gözlemlendi.
Bu tutarsızlık, arama sorgularının nasıl oluşturulduğundan kaynaklanıyordu. CONTAINSTABLE
fonksiyonu kullanarak yapılan ilk uygulama, kısmi kelime aramaları için gereken esnekliği sağlamıyordu.
Çözüm
İyi haber şu ki, sorguda bazı değişikliklerle tam metin arama doğru bir şekilde çalışabilir ve kısmi girişlerle bile istenen sonuçları sağlayabilir. SQL sorgusunda nasıl ayarlamalar yapılacağını şu şekilde açıklayalım:
Adım 1: Arama Dizesini Değiştirin
Anahtar değişiklik, arama dizesinin nasıl oluşturulduğudur. Sadece doğrudan girişi kullanmak yerine, joker karakterleri (*
) kullanabilir ve girişi boşluklardan ayırarak daha esnek bir arama deseni oluşturabiliriz.
Örnek Uygulama
İşte değiştirilen SQL sorgusunun versiyonu:
@Name nvarchar(100),
...
-- Arama dizesini doğru formatlamak için bu satırı ekledik
DECLARE @SearchString varchar(100)
-- Boşlukları joker desenler ile değiştir
SET @SearchString = REPLACE(@Name, ' ', '*" OR "*')
SET @SearchString = '"*'+@SearchString+'*"'
SELECT Per.Lastname, Per.Firstname, Per.MiddleName
FROM Person as Per
INNER JOIN CONTAINSTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) AS KEYTBL
ON Per.Person_ID = KEYTBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEYTBL.RANK DESC;
Değişikliklerin Açıklaması
-
Joker Ekleme: Arama terimlerinin önüne ve arkasına
*
ekleyerek, SQL Server’ın kısmi eşleşmeleri yakalamasına izin veriyoruz. Bu, kullanıcıPhillip
diye aradığında,Phillip
içeren isimleri bulmasını sağlayacaktır. -
Boşluk İşleme:
REPLACE
fonksiyonu,Amy Wong
gibi girdileri SQL Server’ın ayrı terimler olarak yorumlayabileceği bir formatta dönüştürür. Boşlukları, varyasyonları bulmak için gereken arama söz dizimi ile değiştirir. -
Rütbe Filtreleme: Sorgu ayrıca yalnızca belirli bir
RANK
olan sonuçların görüntülenmesini sağlıyor ve en alakalı eşlemeleri önceliklendiriyor.
Sonuç
Bu tekniklerle SQL Server sorgularınızı geliştirerek, tam metin arama işlevselliğinizin verimliliğini ve doğruluğunu artırabilirsiniz. Bu, kullanıcı deneyimini geliştirmekle kalmaz, aynı zamanda uygulamanın giriş varyasyonlarına daha duyarlı olmasını sağlar. Etkili arama yapmanın anahtarının genellikle girdinin veritabanı tarafından nasıl anlaşıldığı ve işlendiği olduğunu unutmayın.
Bu stratejileri uygulayarak, uygulamanız etkili arama sonuçları sağlayacak ve kullanıcıların arama sorgularını nasıl girdiğinden bağımsız olarak ihtiyaç duydukları bilgileri bulmalarına yardımcı olacaktır. Konuyla ilgili daha fazla sorunuz varsa veya ek açıklama istediğiniz bir konu varsa, lütfen bizimle iletişime geçin!