SQL Server full-text search: bir stop word aramamızı bozduğunda
SQL Server üzerindeki bir full-text arama geçerli sorgularda sonuç vermemeye başladı; neden, İngilizce stoplist'te bulunduğu için index'e hiç girmeyen 'both' kelimesiydi. Yazar, sys.dm_fts_parser ile Noise Word'ün nasıl görünür olduğunu ve stoplist'i tamamen kapatmadan önce değerlendirdikleri dört seçeneği anlatıyor.
Kilit noktalar
- İngilizce sistem stoplist'inde bulunan bir stop word full-text index'e hiç eklenmez, dolayısıyla hiçbir şeyle eşleşemez.
- Boolean CONTAINS sorgusunda eksik stop word, SQL Server'ın kalan terimleri değerlendirmesi yerine sıfır satır döndürmesine yol açar.
- sys.fulltext_system_stopwords ve sys.dm_fts_parser bunu ortaya çıkarır: kelime Noise Word olarak raporlanır.
- Buradaki çözüm, her kelimeyi indeksleyen ALTER FULLTEXT INDEX ... SET STOPLIST = OFF oldu.
- Yalnızca birkaç kelime sorun çıkarıyorsa FROM SYSTEM STOPLIST ile oluşturulup DROP ile daraltılan özel bir stoplist daha ucuz seçenek.
- Yeniden doldurmayı FULLTEXTCATALOGPROPERTY(..., 'PopulateStatus') ile izleyin, kelimeyi sys.dm_fts_index_keywords ile doğrulayın.
SQL Server Full-Text Search üzerine kurulu bir arama, daha önce çalışan sorgularda aniden sıfır satır döndürmeye başladı; suçlu tek bir kelimeydi: "both". 'both' İngilizce sistem stoplist'inde yer aldığı için full-text index'e hiç yazılmıyor ve CONTAINS içinde boolean operatörler varken SQL Server eksik terimi sessizce atlamıyor; koşulun tamamını başarısız sayıp boş sonuç veriyor.
Ekip bunu sys.fulltext_system_stopwords ve sys.dm_fts_parser ile teşhis etti; parser çıktısında kelime Noise Word olarak işaretleniyor. Ardından index'i STOPLIST = OFF ile yeniden yapılandırdılar, yani artık her kelime indeksleniyor ve aranabiliyor. Bedeli var: daha büyük index, daha uzun population süresi ve neredeyse her satırla eşleşen kelimeler. Yalnızca birkaç kelime sorun çıkarıyorsa sistem stoplist'inden türetilmiş özel bir stoplist daha dar bir çözüm.
Gerçek dünyada kullanımı
- Kullanıcıların tek arama kutusunda birden çok kelime yazdığı ve hepsinin dikkate alınmasını beklediği bir ürün kataloğu.
- SQL Server üzerindeki bir doküman arşivinde, çok terimli sorgudaki bir stop word'ün sessizce boş sonuç sayfası döndürdüğü durum.
- Kodda sabit bir kelime listesi yerine dil başına tek bir indexleme kararı gereken çok dilli bir uygulama.
Neden önemli
Aramanız CONTAINS kullanıyorsa ve kullanıcılar birden çok kelimeyi birlikte yazıyorsa, tek bir yaygın kelime boş sayfa döndürüp veri hatası gibi görünebilir; parser'ı ve stoplist'i bilmek tahmin etmeyi bitirir.