Bu makalede SQL Server’da Full-Text search kurulumu ve sorgu örnekleri anlatılacaktır. Makalenin amacı sorgu sonucu uzun süren string alanlarda Full-Text Search kullanarak sorguların hızlı geri dönüşünü sağlamaktır.
1-) Full-Text Search kurulumu, SQL Server kurulum dosyası içerisinden “Full-Text and Semantic Extractions for Search” özelliği seçilere kurulum tamamlanır.
2-) Full-Text Search kurulumu tamamlandıktan sonra Configuration Manager Ekranında bu özelliğin geldiğini ve Running modda olduğundan emin olunmalıdır. Bu özelliğin aktif olması için kurulum sonra PC restarta gönderilir.
3-) Full-Text search özelliğini kullanmak öncelikle katalog belirlemelisiniz. Oluşturacağınız kataloğu script ile veyahut SSMS üzerinden yapabilirsiniz. Eğer biz search edeceğimiz veri içerisinde ş,i,ö,ğ gibi Türkçe karakterlere duyarlı olmasını istiyorsak ACCENT SENSITIVITY özelliği ON olarak oluşturulmalı.
CREATE fulltext catalog FTC_TblName WITH ACCENT_SENSITIVITY= OFF AUTHORIZATION [dbo];
4-) Oluşturulan katalog içerisine Hangi tablonun hangi kolonunun da search yapılacaksa o alan create scripte eklenir. Ayrıca değişikliklerin işlemesi için change tracking açık olmalı ve system bilgisine ait kelimeleri aramada saymaması için stoplist’e eklenir.
CREATE fulltext INDEX ON [dbo].[Tbl_FTS]([Name]) KEY INDEX [PK_Tbl_FTS] on FTC_TblName WITH CHANGE_TRACKING AUTO, STOPLIST = SYSTEM
5-) Aramada olmamasını istediğimiz kelimeler olursa bir stoplist oluşuturulur.
CREATE FULLTEXT STOPLIST [TurkceBaglaclar] AUTHORIZATION [dbo];
6-) Search yaparken istemediğimiz kelimeler stopword’e eklenir.
ALTER FULLTEXT STOPLIST [TurkceBaglaclar] ADD ‘ve’ LANGUAGE ‘English’;
7-) Eklemiş olduğumuz stopword kelimelerini aşağıdaki dmv ile bulabiliriz.
select * from sys.fulltext_stopwords
Sorgu Örnekleri
select * from Tbl_FTS with(nolock) WHERE CONTAINS(Name,'”Adam Eva”‘)
–Adam Eva Kelimesini(büyük küçük uyumuna bakmaksızın) bulur.
select * from Tbl_FTS with(nolock) WHERE CONTAINS(Name,'”Adam Eva*”‘)
–Adam Eva ve Adam EVATAR, Adam EVACAN isimlerini de getirir. Kısacası Eva kelimesinden sonra gelen tüm kelimeleri içeren kelimeleri bulur.(büyük küçük uyumuna bakmaksızın) bulur.(Başına * koymak sorguda değişikliğe neden olmaz.)
select * from Tbl_FTS with(nolock) WHERE CONTAINS(Name,'”Ad Ev*” near Habil’)
–Ad ile başlayıp yanında Ev ve Ev’dan türeyen kelimeler ile ayrıca Habil kelimesi geçen içeriği bulur.
select * from Tbl_FTS with(nolock) WHERE CONTAINS(Name,’Ad near Ev’)
ve
select * from Tbl_FTS with(nolock) WHERE CONTAINS(Name,’Ad ~ Ev’)
— near ve ~ işareti aynı anlama gelmektedir. Yukarıdaki sorgu sonucu bize Ad ve Ev yan yana geçen içeriği verir.
select * from Tbl_FTS with(nolock) WHERE CONTAINS(Name,'”*Adam*” or “*Eva*”‘)
–Adam veya Eva ile başlayan isimleri bulur. İki isimlilerde sıralama önemli değildir.
select * from Tbl_FTS with(nolock) WHERE Freetext(Name,'”*Adam*” or “*Eva*”‘)
–İçinde Adam geçen tüm kelimeleri bulur. Eva kelimesinin olmasının bir önemi yok.
select * from Tbl_FTS with(nolock) WHERE CONTAINS(Name,’FORMSOF(INFLECTIONAL, sürmek)’)
–Eş anlamlı tüm kelimeleri bulur. Kullanmak vb.
select * from Tbl_FTS with(nolock) WHERE CONTAINS(Name,’FORMSOF(THESAURUS, sürmek)’)
–sürmek kelimesine ait tüm tense’leri bulur. Sürdü, sürecek, sürüyor vb.
select f.*,D.Name from
containstable(Tbl_FTS,Name,N’ISABOUT (Adam weight(.1), Eva weight(.9))’) F
INNER JOIN Tbl_FTS D ON F.[KEY] = D.ID
ORDER BY F.RANK
–Adam ve Eva kelimelerini içeren tüm kelimeleri bulur. Belirlediğimiz kelimenin full-text atılan kolon altındaki row’un genele oranından kaynaklı ağırlık oranlarına göre sql rank’layarak sıralar.
select f.*,D.Name from
freetexttable(Tbl_FTS,Name,N’ISABOUT (Adam weight(.1), Eva weight(.9))’) F
INNER JOIN Tbl_FTS D ON F.[KEY] = D.ID
ORDER BY F.RANK
–Adam ve Eva kelimelerini içeren tüm kelimeleri bulur. Belirlediğimiz kelimenin full-text atılan kolon altındaki row’un genele oranından kaynaklı Ağırlık oranlarına göre sql rank’layarak sıralar. Buradaki rank’ın containstable’dan farklı olması “freetexttable” aramada sadece kelimenin yoğunluğunu alması.
Katkılarından dolayı Murat Sarı’ya teşekkürler.
SQL Server 2019 Full-Text Upgrade - VERITABANI.ORG 29 Mayıs 2023
[…] Search hakkında detaylı bilgi almak için Full-Text Search Kurulumu ve Sorgu Örnekleri adlı makaleyi […]