RANK ile arama sonuçlarını sınırlama

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

CONTAINSTABLE ve FREETEXTTABLE fonksiyonları, 0'dan 1.000'e kadar sıralı değerleri (rank değerleri) içeren bir sütun RANK döndürür. Bu değerler, satırları seçim kriterlerine ne kadar iyi uyduklarına göre sıralar. Derece değerleri, sonuç kümesindeki satırların yalnızca göreli bir ilgi sırasını gösterir ve daha düşük bir değer daha düşük ilgi gösterir. Gerçek değerler önemli değildir ve genellikle sorgu her çalıştırıldığında farklı olur.

Not

CONTAINS ve FREETEXT önkoşulları herhangi bir derece değeri döndürmez.

Bir arama koşuluyla eşleşen öğe sayısı genellikle büyüktür. Sorguların çok fazla eşleşme döndürmesini önlemek için isteğe bağlı CONTAINSTABLE parametresini kullanın.FREETEXTTABLE Yalnızca satırların bir alt kümesini döndürür. top_n_by_rank, yalnızca en yüksek sıralı n eşleşmenin azalan sırayla döndürüldüğünü belirten tam sayı değeri olan n'dir. top_n_by_rank diğer parametrelerle birleştirilirse, sorgu tüm koşullarla eşleşen satır sayısından daha az satır döndürebilir.

SQL Server Database Engine, eşleşmeleri sıralamaya göre sıralar ve yalnızca belirtilen satır sayısına kadar geri getirir. Örneğin, normalde 1.000.000 satırlık bir tablodan 100.000 satır döndüren bir sorgu, yalnızca en üst 100 satır istendiğinde daha hızlı işlenir.

RANK'ı arama sonuçlarını sınırlamak için kullanma örnekleri

Örnek A: Yalnızca ilk üç eşleşme aranıyor

Aşağıdaki örnek yalnızca ilk üç eşleşmeyi döndürmek için CONTAINSTABLE kullanır.

USE AdventureWorks2025;
GO

SELECT K.RANK,
       AddressLine1,
       City
FROM Person.Address AS A
     INNER JOIN CONTAINSTABLE (Person.Address, AddressLine1, 'ISABOUT ("des*",
    Rue WEIGHT(0.5),
    Bouchers WEIGHT(0.9))', 3) AS K
     ON A.AddressID = K.[KEY];
GO

Sonuç kümesi aşağıdadır.

RANK        Address                          City
----------- -------------------------------- ------------------------------
172         9005, rue des Bouchers           Paris
172         5, rue des Bouchers              Orleans
172         5, rue des Bouchers              Metz

Örnek B: En iyi beş eşleşme aranıyor

Aşağıdaki örnekte, CONTAINSTABLE sütununun Description sözcüğünün veya lightsözcüğünün yanında "alüminyum" sözcüğünün bulunduğu ilk beş ürünün açıklamasını döndürmek için lightweight kullanılır.

USE AdventureWorks2025;
GO

SELECT FT_TBL.ProductDescriptionID,
       FT_TBL.Description,
       KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL
     INNER JOIN CONTAINSTABLE (Production.ProductDescription,
         Description, '(light NEAR aluminum) OR (lightweight NEAR aluminum)', 5) AS KEY_TBL
         ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY];
GO

Arama sorgusu sonuçları nasıl derecelenir?

Tam metin arama, tam metin sorgusunun verdiği verilerin alaka düzeyini gösteren isteğe bağlı bir puan (veya sıralama değeri) oluşturabilir. Bu sıralama değeri her satır üzerinde hesaplanır ve verilen bir sorgunun sonuç kümesini alaka düzeyine göre sıralamak için bir sıralama kriteri olarak kullanılabilir. Derece değerleri, sonuç kümesindeki satırların yalnızca göreli bir ilgi sırasını gösterir. Gerçek değerler önemsizdir ve genellikle sorgu her çalıştırıldığında farklılık gösterir. Sıralama değeri sorgular arasında herhangi bir öneme sahip değildir.

Derecelendirme için istatistikler

Bir endeks oluşturduğunuzda, sistem sıralamada kullanmak üzere istatistikleri toplar. Tam metin katalog oluşturmak doğrudan tek bir indeks yapısı oluşturmaz. Bunun yerine, Full-Text Motoru verileri indekslerken ara indeksler oluşturur. Full-Text Altyapısı daha sonra bu dizinleri gerektiğinde daha büyük bir dizinle birleştirir. Bu süreç birçok kez olabilir. Full-Text Motoru daha sonra tüm ara dizinleri tek bir büyük ana dizinde birleştiren bir "ana birleştirme" gerçekleştirir.

İstatistikler her ara dizin düzeyinde toplanır. Dizinler birleştirildiğinde istatistikler birleştirilir. Bazı istatistiksel değerler yalnızca ana birleştirme işlemi sırasında oluşturulabilir.

Database Engine bir sorgu sonuç kümesini sıralarken, en büyük ara indeksten alınan istatistikleri kullanır. Bu kullanım, ara indekslerin birleştirilip birleştirilmediğine bağlıdır. Sonuç olarak, ara dizinler birleştirilmeyen derecelendirme istatistikleri doğrulukta farklılık gösterebilir. Bu doğruluk farkı, aynı sorgunun zaman içinde tam metin indeksli veriler eklendikçe, değiştirilip silindikçe ve küçük indeksler birleştirildiğinde farklı sıralama sonuçları döndürebilmesini açıklar.

Dizinin boyutunu ve hesaplama karmaşıklığını en aza indirmek için istatistikler genellikle yuvarlanr.

Aşağıdaki listede, derecenin hesaplanmasında önemli olan bazı yaygın kullanılan terimler ve istatistiksel değerler yer almaktadır.

Terim / değer Açıklama
Özellik Satırın tam metin dizinli sütunu.
belge Sorgularda geri döndürülen varlık. Database Engine'de bu bir satıra karşılık gelir. Bir belgenin birden çok özelliği olabilir, tıpkı bir satırın birden çok tam metin dizinli sütunu olabileceği gibi.
Dizini Bir veya daha fazla belgenin tek bir ters dizini. Bu tamamen bellekte veya diskte olabilir. Birçok sorgu istatistiği, eşleşmenin gerçekleştiği tek tek dizine göredir.
Full-Text Katalog Sorgular için tek bir varlık olarak ele alınan ara dizin koleksiyonu. Kataloglar, yöneticilerin organizasyonun birimi olarak gördüğü şeydir.
Word, jeton veya eşya Tam metin motorundaki eşleştirme birimi. Belgelerdeki metin akışları, dile özgü sözcük ayırıcıları tarafından kelimelere ya da belirteçlere ayrıştırılır.
Oluşum Sözcük ayırıcı tarafından belirlenen belge özelliğindeki sözcük uzaklığı. İlk kelime 1. sırada, sonraki 2'de ve bu şekilde devam eder. İfade ve yakınlık sorgularında yanlış pozitifleri önlemek için, cümle sonları ve paragraf sonları eşleşmeler arasında daha büyük aralıklar oluşmasına neden olur.
Terim Frekansı Anahtar değerin arka arkaya kaç kez gerçekleştiği.
indexedRowCount Dizine alınan toplam satır sayısı. Bu değer, ara endekslerde tutulan sayılara dayanarak hesaplanır. Bu sayı doğrulukta farklılık gösterebilir.
KeyRowCount Tam metin kataloğundaki belirli bir anahtarı içeren toplam satır sayısı.
MaxOccurrence Bir satırdaki belirli bir özellik için tam metin kataloğunda kaydedilen en büyük oluşum.
MaxQueryRank En yüksek rütbe, 1000, Full-Text Engine tarafından geri getirildi.

Rütbe hesaplama sorunları

Sıralama hesaplama sürecini birçok faktör etkiler. Farklı dil sözcük ayırıcıları, metni farklı şekillerde parçalar. Örneğin, bir kelime kırıcı "köpek-ev" dizesini "köpek" ve "ev" olarak bölür, ancak başka bir kelime kırıcı bunu "köpek evi" olarak kabul eder. Eşleşme ve sıralama, belirtilen dile göre değişir, çünkü sadece kelimeler değil, belge uzunluğu da farklıdır. Belge uzunluğu farkı tüm sorguların derecelendirmesini etkileyebilir.

IndexRowCount gibi istatistikler büyük ölçüde farklılık gösterebilir. Örneğin, bir katalogda ana indekste 2 milyar satır varsa, yeni bir belge bellek içi ara indekse indekslenir ve o belgenin bellek içi indeksindeki belge sayısına göre sıralamaları, ana indeksteki belgelerin sıralamalarına kıyasla çarpık olabilir. Bu nedenle, çok sayıda satırın indekslendiği veya yeniden indekslendiği herhangi bir popülasyondan sonra, Transact-SQL ifadesi kullanılarak ALTER FULLTEXT CATALOG ... REORGANIZE indeksleri ana bir indekse birleştirin. Full-Text Altyapısı ayrıca ara dizinlerin sayısı ve boyutu gibi parametrelere göre dizinleri otomatik olarak birleştirir.

MaxOccurrence değerleri 32 aralığın 1'inde normalleştirilir. Bu normalleştirme, örneğin 50 kelimelik bir belgenin, 100 kelimelik bir belgeyle aynı şekilde ele alındığı anlamına gelir. Aşağıdaki tablo normalizasyonu göstermektedir. Belge uzunlukları bitişik tablo değerleri 32 ile 128 arasındaki aralıkta olduğundan, 128 (32 <docLength<= 128) aynı uzunlukta olarak etkili bir şekilde ele alınır.

{ 16, 32, 128, 256, 512, 725, 1024, 1450, 2048, 2896, 4096, 5792, 8192, 11585,
16384, 23170, 28000, 32768, 39554, 46340, 55938, 65536, 92681, 131072, 185363,
262144, 370727, 524288, 741455, 1048576, 2097152, 4194304 };

CONTAINSTABLE'ın sırası

CONTAINSTABLE derecelendirmesi aşağıdaki algoritmayı kullanır:

StatisticalWeight = Log2( ( 2 + IndexedRowCount ) / KeyRowCount )
Rank = min( MaxQueryRank, HitCount * 16 * StatisticalWeight / MaxOccurrence )

İfade eşleşmeleri, bireysel anahtarlar gibi sıralanır, ancak KeyRowCount (ifadeyi içeren satır sayısı) tahmini bir değerdir ve bu değer gerçek sayıdan daha yüksek olabilir.

YAKINlik derecesi

CONTAINSTABLE, NEAR seçeneğini kullanarak birbirine yakın olan iki veya daha fazla arama terimini sorgulamayı destekler. Döndürülen her satırın derecelendirme değeri birkaç parametreyi temel alır. Ana derecelendirme faktörlerinden biri, belgenin uzunluğuna kıyasla toplam eşleşme sayısı veya başarısıdır. Bu nedenle, örneğin, 100 sözcüklü bir belge ve 900 sözcüklü bir belge aynı eşleşmeleri içeriyorsa, 100 sözcüklü belge daha yüksek sıralanır.

Bir satırdaki her bir isabetin toplam uzunluğu, ilgili satırın ilk ve son arama terimleri arasındaki mesafeye bağlı olarak bu satırın derecelendirmesine de katkıda bulunur. Mesafe ne kadar küçük olursa, isabet satırın derece değerine o kadar katkıda bulunur. Tam metin sorgusu maksimum mesafe olarak tam sayı belirtmiyorsa, sadece 100 mantıksal terimden fazla mesafe olan hitleri içeren bir belgenin sıralaması 0'dır.

ISABOUT sıralaması

CONTAINSTABLE, ISABOUT seçeneğini kullanarak ağırlıklı terimleri sorgulamayı destekler. ISABOUT, geleneksel bilgi alma terminolojisindeki bir vektör uzay sorgusudur. Kullanılan varsayılan derecelendirme algoritması, yaygın olarak bilinen bir formül olan Jaccard'dır. Sıralama, sorgudaki her terim için hesaplanır ve aşağıdaki algoritmada açıklandığı gibi birleştirilir.

ContainsRank = same formula used for CONTAINSTABLE ranking of a single term (above).
Weight = the weight specified in the query for each term. Default weight is 1.
WeightedSum = Σ[key=1 to n] ContainsRankKey * WeightKey
Rank =  ( MaxQueryRank * WeightedSum ) / ( ( Σ[key=1 to n] ContainsRankKey^2 )
      + ( Σ[key=1 to n] WeightKey^2 ) - ( WeightedSum ) )

FREETEXTTABLE Derecesi

FREETEXTTABLE derecelendirmesi OKAPI BM25 derecelendirme formülünü temel alır. FREETEXTTABLE Sorgular, çekimli üretim yoluyla (orijinal sorgu kelimelerinin çekimli biçimleri) sorguya kelimeler ekler. Bu kelimeler, üretildikleri kelimelerle özel bir ilişkisi olmayan ayrı kelimeler olarak ele alınır. Eş Anlamlılar Sözlüğü özelliğinden oluşturulan eş anlamlılar ayrı, eşit ağırlıklı terimler olarak kabul edilir. Sorgudaki her sözcük dereceye katkıda bulunur.

Rank = Σ[Terms in Query] w ( ( ( k1 + 1 ) tf ) / ( K + tf ) ) * ( ( k3 + 1 ) qtf / ( k3 + qtf ) ) )
Where:
w is the Robertson-Sparck Jones weight.
In simplified form, w is defined as:
w = log10 ( ( ( r + 0.5 ) * ( N - R + r + 0.5 ) ) / ( ( R - r + 0.5 ) * ( n - r + 0.5 ) )
N is the number of indexed rows for the property being queried.
n is the number of rows containing the word.
K is ( k1 * ( ( 1 - b ) + ( b * dl / avdl ) ) ).
dl is the property length, in word occurrences.
avdl is the average length of the property being queried, in word occurrences.
k1, b, and k3 are the constants 1.2, 0.75, and 8.0, respectively.
tf is the frequency of the word in the queried property in a specific row.
qtf is the frequency of the term in the query.