Tam metin dizini oluştururken dil seçme

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen Örneği

Tam metin bir indeks oluşturduğunuzda, indekslenen sütun için sütun düzeyinde bir dil belirtin. Sütun üzerindeki tam metin sorguları, belirtilen dilin sözcük ayırıcılarını ve kök bulucularını kullanır. Full-Text Engine'in sütun dilini seçerken metninizi tokenize edip indekslediğini düşünün.

Uyarı

Tam metin dizini sütunu için sütun düzeyinde bir dil belirtmek için sütunu belirtirken yan tümcesini LANGUAGE <language_term> kullanın. Daha fazla bilgi için bkz. CREATE FULLTEXT INDEX ve ALTER FULLTEXT INDEX.

Bu bölümde sözcük ayırıcılar ve kök bulucular tanıtılır; ayrıca Tam Metin Arama'nın sütun düzeyinde tanımlanan dilin dil kodu tanımlayıcısını (LCID) nasıl kullandığı ele alınır.

Sözcük ayırıcılara ve kök buluculara giriş

SQL Server Database Engine, birçok dil için varsayılan olarak etkin olan sözcük ayırıcılar ve kök bulucular içerir. Microsoft Doğal Dil Grubu (NLG) bu dil bileşenlerini uygular ve destekler. Desteklenen dillerin listesi için bkz. sys.fulltext_languages.

Kelime kesiciler ve filtreler gibi harici bileşenler güvenliği artırmak için imzalanmalıdır. İmzalama doğrulamak için aşağıdaki ifadeyi çalıştırın:

EXECUTE sp_fulltext_service 'verify_signature';

Full-Text Arama sütun düzeyi dilin adını nasıl kullanır?

Tam metin indeks oluşturduğunuzda, her sütun için geçerli bir dil adı belirtin. Bir dil adı geçerliyse ancak sys.fulltext_languages katalog görünümü onu döndürmezse, Full-Text Arama varsa aynı dil ailesinin en yakın mevcut dil adına geri döner. Aksi takdirde Full-Text Arama, Nötr sözcük ayırıcısına geri döner. Bu yedek davranışı önlemek için, geçerli ve mevcut bir dil adı belirtin.

Uyarı

LCID, tam metin dizinleme için uygun olan tüm veri türlerinde ( char veya nchar gibi) kullanılır. Karakter, varchar veya metin türü sütununun sıralama düzeni LCID tarafından tanımlanan dilden farklı bir dil ayarına ayarlandıysa, LCID yine de bu sütunların tam metin dizini ve sorgulanması sırasında kullanılır.

Sözcük bölme

Bir sözcük ayırıcı, dizinlenen metni dile özgü sözcük sınırlarına göre belirteçlere ayırır. Bu nedenle, sözcük bölme davranışı farklı diller arasında farklılık gösterir. Birkaç dili {x, x ve y} dizine eklemek için tek bir dil, z, kullanırsanız, bazı davranışlar xy beklenmedik sonuçlara neden olabilir. Örneğin, bir kısa çizgi (-) ya da bir virgül (,), bir dilde yok sayılan ancak başka bir dilde yok sayılmayan bir kelime ayırma öğesi olabilir. Nadiren, beklenmedik kök bulma davranışı görülebilir; çünkü aynı sözcük farklı dillerde farklı biçimlerde köküne indirgenebilir. Örneğin, İngilizce dilinde sözcük sınırları genellikle boşluk veya bir tür noktalama işaretidir. Almanca gibi diğer dillerde kelimeler veya karakterler birleştirilebilir. Bu nedenle, seçtiğiniz sütun düzeyindeki dil, bu sütunun satırlarında depolamayı beklediğiniz dili temsil etmelidir.

Batı dilleri

Batı dil ailesi için, hangi dillerin bir sütunda depolandığından emin değilseniz veya birden fazla dilin depolanmasını bekliyorsanız, genel bir geçici çözüm, sütunda depolanabilecek en karmaşık dil için sözcük ayırıcıyı kullanmaktır.

Örneğin, İngilizce, İspanyolca ve Almanca içeriği tek bir sütunda depolamayı bekleyebilirsiniz. Bu üç Batı dili benzer sözcük bölme kalıplarına sahiptir; bunlar arasında Almanca kalıplar en karmaşık olanlardır. Bu nedenle, bu durumda iyi bir tercih, İngilizce ve İspanyolca metinleri doğru şekilde işleyen Almanca kelime kırıcıyı kullanmaktır. Buna karşılık İngilizce sözcük ayırıcı, Almanca'nın bileşik sözcükleri nedeniyle Almanca metinleri mükemmel işleyemeyebilir.

Bir dil ailesindeki en karmaşık dilin sözcük ayırıcısını kullanmak, o ailedeki her dilin kusursuz biçimde dizinlenmesini garanti etmez. Başka bir dilde yazılmış metni en karmaşık sözcük ayırıcının bile doğru şekilde işleyemeyebileceği uç durumlar olabilir.

Batı dışı diller

Batı dışı diller için (örneğin Çince, Japonca, Hintçe vb.) önceki çözüm dilsel nedenlerle mutlaka işe yaramıyor. Batı dışı diller için aşağıdaki geçici çözümlerden birini düşünün:

  • Farklı ailelerden diller için

    Bir sütunda İspanyolca ve Japonca gibi önemli ölçüde farklı diller bulunabilecekse, farklı dillerin içeriğini ayrı sütunlarda depolamayı göz önünde bulundurun. Bu ayrım, her sütun için dile özgü kelime kırıcısını kullanmanıza olanak tanır. Bu çözümü seçerseniz ve sorgu zamanında sorgu dilini bilmiyorsanız, sorgunun doğru satırı veya belgeyi bulduğundan emin olmak için her iki sütunda da sorguyu vermeniz gerekebilir.

  • İkili içerik için (örneğin Microsoft Word belgeleri)

    Indekslenen içerik ikili tipteyse, metin içeriği kelime bozucuya göndermeden önce işleyen Full-Text Search filtresi, ikili dosyadaki belirli dil etiketlerini onurlandırabilir. Bu durumda, dizin oluşturma zamanında, filtre bir belge veya belgenin bölümü için doğru LCID'yi yayar. Tam Metin Altyapısı daha sonra bu LCID’ye sahip dil için sözcük ayırıcısını çağırır. Ancak, çok dilli içeriği indeksledikten sonra, içeriğin doğru şekilde indekslendiğini doğrulayın.

  • Düz metin içeriği için

    İçeriğiniz düz metin olduğunda, içeriği xml veri türüne dönüştürebilir ve her bir belge veya belge bölümüne karşılık gelen dili gösteren dil etiketleri ekleyebilirsiniz. Ancak bunun işe yarayebilmesi için tam metin dizini oluşturmadan önce dili bilmeniz gerekir.

Dallanma

Sütun düzeyinde dilinizi seçerken dikkate alınması gereken bir diğer nokta da kökenlendirmedir. Tam metin sorgularında kök bulma, belirli bir dilde bir sözcüğün tüm çekimli biçimlerini arama işlemidir. Çeşitli dilleri işlemek için genel bir sözcük ayırıcı kullandığınızda, gövdeleme işlemi yalnızca sütun için belirtilen dilde çalışır; sütundaki diğer dillerde çalışmaz. Örneğin, Almanca kök adları İngilizce veya İspanyolca (vb.) için çalışmaz. Bu davranış, sorgu zamanında hangi dili seçtiğinize bağlı olarak geri çağırmanızı etkileyebilir.

Dil seçiminde dikkate alınacak bir diğer nokta da verilerin nasıl temsil edilmesiyle ilgilidir. Varbinary(max) sütununda depolanmayan veriler için özel filtreleme yapılmaz. Bunun yerine, metin genellikle olduğu gibi sözcük ayırma bileşeninden geçirilir.

Ayrıca, sözcük ayırıcılar esas olarak yazılı metni işlemek için tasarlanmıştır. Metninizde işaretleme (örneğin HTML) varsa, indeksleme ve arama sırasında dilsel doğruluk azalabilir. Bu durumda iki seçeneğiniz vardır: tercih edilen yöntem, metin verisini varbinary(max) bir sütunda depolamak ve belge türünü belirtmektir ki filtrelenebilir. Eğer bu yaklaşım mümkün değilse, nötr kelime kırıcı kullanmayı ve mümkünse gürültülü kelime listelerine işaretleme verilerini (örneğin HTML'de 'br' gibi) eklemeyi düşünün.

Uyarı

Dil tabanlı kök belirleme, nötr dili belirttiğinizde uygulanmaz.

Tam metin sorguda varsayılan olmayan sütun seviyesinde bir dil belirtin

Varsayılan olarak, Database Engine'de Full-Text Search, tam metin cümlesinde her sütun için belirtilen dili kullanarak sorgu terimlerini ayrıştırır. Bu davranışı geçersiz kılmak için sorgu sırasında varsayılan olmayan bir dil belirtin. Kaynakları yüklü olan desteklenen diller için, LANGUAGE <language_term>, CONTAINSTABLE, FREETEXT veya FREETEXTTABLE sorgusundaki yan tümce, sorgu terimlerinde sözcük ayırma, kök bulma, eş anlamlılar sözlüğü ve durak sözcük işleme için kullanılan dili belirtmek amacıyla kullanılabilir.