Ogranicz wyniki wyszukiwania przy użyciu funkcji RANK

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Funkcje CONTAINSTABLE i FREETEXTTABLE zwracają kolumnę o nazwie, RANK która zawiera wartości porządkowe od 0 do 1 000 (wartości rangi). Te wartości porządkują wiersze według tego, jak dobrze odpowiadają kryteriom wyboru. Wartości rangi wskazują tylko względną kolejność istotności wierszy w zestawie wyników z niższą wartością wskazującą niższą istotność. Rzeczywiste wartości są nieistotne i zazwyczaj zmieniają się za każdym razem, gdy zapytanie się uruchamia.

Notatka

Predykaty CONTAINS i FREETEXT nie zwracają żadnych wartości klasyfikacji.

Liczba elementów pasujących do warunku wyszukiwania jest często duża. Aby zapobiec zwracaniu zbyt wielu dopasowań przez zapytania CONTAINSTABLE lub FREETEXTTABLE, użyj opcjonalnego parametru top_n_by_rank. Zwraca tylko podzbiór wierszy. top_n_by_rank to liczba całkowita n, która określa, że zwracanych jest tylko n dopasowań o najwyższej pozycji w rankingu, w kolejności malejącej. Jeśli top_n_by_rank jest połączona z innymi parametrami, zapytanie może zwrócić mniej wierszy niż liczba wierszy, które faktycznie pasują do wszystkich predykatów.

SQL Server Database Engine porządkuje dopasowania według rangi i zwraca tylko do określonej liczby wierszy. Na przykład zapytanie, które zwykle zwraca 100 000 wierszy z tabeli liczącej 1 000 000 wierszy, jest przetwarzane szybciej, jeśli żądane są tylko najwyższe 100 wierszy.

Przykłady wykorzystania RANK do ograniczenia wyników wyszukiwania

Przykład A: wyszukiwanie tylko trzech najlepszych dopasowań

W poniższym przykładzie użyto CONTAINSTABLE, aby zwrócić tylko trzy pierwsze dopasowania.

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

Oto zestaw wyników.

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

Przykład B: wyszukiwanie pięciu najlepszych dopasowań

W poniższym przykładzie użyto CONTAINSTABLE, aby zwrócić opis pięciu pierwszych produktów, w których kolumna Description zawiera słowo "aluminium" w pobliżu wyrazu light lub słowa lightweight.

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

Jak są klasyfikowane wyniki zapytania wyszukiwania

Wyszukiwanie pełnotekstowe może generować opcjonalny wynik (lub wartość rankingową), która wskazuje trafność danych zwracanych przez pełnotekstowe zapytanie. Ta wartość rankingowa jest obliczana dla każdego wiersza i może być używana jako kryterium porządku do sortowania zbioru wyników danego zapytania według trafności. Wartości rangi wskazują tylko względną kolejność istotności wierszy w zestawie wyników. Rzeczywiste wartości są nieistotne i zwykle różnią się za każdym razem, gdy zapytanie jest uruchamiane. Wartość rangi nie zawiera żadnego znaczenia w zapytaniach.

Statystyki dotyczące klasyfikacji

Gdy budujesz indeks, system zbiera statystyki do wykorzystania w rankingu. Budowanie katalogu pełnego tekstu nie tworzy bezpośrednio jednej struktury indeksowej. Zamiast tego Full-Text Engine tworzy indeksy pośrednie podczas indeksowania danych. Aparat Full-Text następnie scala te indeksy z większym indeksem zgodnie z potrzebami. Ten proces może się powtarzać wielokrotnie. Następnie aparat Full-Text przeprowadza "scalanie nadrzędne", które łączy wszystkie indeksy pośrednie w jeden duży indeks główny.

Statystyki są zbierane na każdym poziomie indeksu pośredniego. Statystyki są scalane po scaleniu indeksów. Niektóre wartości statystyczne można wygenerować tylko podczas procesu scalania głównego.

Podczas gdy Database Engine klasyfikuje zestaw wyników zapytań, wykorzystuje statystyki z największego indeksu pośredniego. To zastosowanie zależy od tego, czy indeksy pośrednie są połączone. W związku z tym statystyki klasyfikacji mogą się różnić w dokładności, jeśli indeksy pośrednie nie są scalane. Ta różnica w dokładności wyjaśnia, dlaczego to samo zapytanie może zwracać różne wyniki rankingowe w czasie, gdy dane indeksowane w pełnym tekstie są dodawane, modyfikowane i usuwane, a mniejsze indeksy są łączone.

Aby zminimalizować rozmiar indeksu i złożoności obliczeniowej, statystyki są często zaokrąglane.

Poniższa lista zawiera niektóre często używane terminy i wartości statystyczne, które są ważne podczas obliczania rangi.

Termin/wartość Opis
właściwości Kolumna indeksowana pełnotekstowo w wierszu.
Dokument Jednostka zwracana w zapytaniach. W silniku bazy danych odpowiada to wierszowi. Dokument może mieć wiele właściwości, podobnie jak wiersz może zawierać wiele kolumn indeksowanych pełnotekstowo.
Indeks Pojedynczy odwrócony indeks jednego lub większej liczby dokumentów. Może to być całkowicie w pamięci lub na dysku. Wiele statystyk zapytań odnosi się do pojedynczego indeksu, w którym wystąpiło dopasowanie.
Full-Text katalog Kolekcja indeksów pośrednich traktowana jako jedna jednostka dla zapytań. Katalogi są postrzegane przez administratorów jako jednostka organizacyjna.
Word, token lub przedmiot Jednostka dopasowania w silniku pełnotekstowym. Ciągi tekstu z dokumentów są dzielone na słowa lub tokeny przez analizatory podziału wyrazów właściwe dla danego języka.
wystąpienia Przesunięcie wyrazu we właściwości dokumentu ustalone przez narzędzie dzielące wyrazy. Pierwsze słowo znajduje się przy wystąpieniu 1, kolejne przy 2 i tak dalej. Aby uniknąć fałszywych trafień w zapytaniach frazowych i zapytaniach bliskości, końce zdań i akapitów wprowadzają większe odstępy między wystąpieniami.
CzęstotliwośćTerminu Liczba razy, gdy wartość klucza pojawia się w rzędzie.
indeksowanaLiczbaWierszy Łączna liczba indeksowanych wierszy. Wartość ta jest obliczana na podstawie liczby utrzymywanych w indeksach pośrednich. Ta liczba może się różnić w dokładności.
KeyRowCount Całkowita liczba wierszy w wykazie pełnotekstowym zawierającym dany klucz.
Maksymalna Wystąpienie Największe wystąpienie przechowywane w wykazie pełnotekstowym dla danej właściwości w wierszu.
MaxQueryRank Maksymalny stopień, 1000, zwracany przez Full-Text Engine.

Problemy z obliczaniem rangi

Na proces obliczania rangi wpływa wiele czynników. Różne systemy dzielenia słów tokenizują tekst w zależności od języka. Na przykład jeden moduł dzielenia wyrazów dzieli ciąg znaków „dog-house” na „dog” i „house”, ale inny moduł dzielenia wyrazów traktuje go jako „dog-house”. Dopasowywanie i ranking różnią się w zależności od wybranego języka, ponieważ nie tylko słowa są różne, ale także długość dokumentu. Różnica długości dokumentu może mieć wpływ na klasyfikację wszystkich zapytań.

Statystyki takie jak IndexRowCount mogą się znacznie różnić. Na przykład, jeśli katalog ma 2 miliardy wierszy w indeksie głównym, a jeden nowy dokument zostanie zindeksowany w pośrednim indeksie w pamięci, pozycje tego dokumentu w rankingu, oparte na liczbie dokumentów w indeksie w pamięci, mogą być zniekształcone w porównaniu z pozycjami dokumentów z indeksu głównego. Z tego powodu, po każdej populacji, która spowoduje indeksowanie lub ponowne indeksowanie dużej liczby wierszy, połącz indeksy w główny indeks za pomocą ALTER FULLTEXT CATALOG ... REORGANIZE instrukcji Transact-SQL. Silnik Full-Text również automatycznie scala indeksy na podstawie parametrów, takich jak liczba i rozmiar indeksów pośrednich.

wartości MaxOccurrence są znormalizowane do jednego z 32 zakresów. Ta normalizacja oznacza na przykład, że dokument o długości 50 słów jest traktowany tak samo jak dokument o długości 100 słów. Poniższa tabela pokazuje normalizację. Ponieważ długość dokumentu znajduje się w zakresie między sąsiednimi wartościami tabeli 32 i 128, są one skutecznie traktowane jako o tej samej długości, 128 (32 <docLength<= 128).

{ 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 };

Ranga funkcji CONTAINSTABLE

klasyfikacji CONTAINSTABLE używa następującego algorytmu:

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

Dopasowania fraz są klasyfikowane podobnie jak poszczególne klucze, z tą różnicą, że KeyRowCount (liczba wierszy zawierających frazę) to szacowana wartość, która może być niedokładna i wyższa niż rzeczywista liczba.

Ranga BLISKIEJ

CONTAINSTABLE obsługuje wykonywanie zapytań dotyczących co najmniej dwóch terminów wyszukiwania znajdujących się w pobliżu siebie przy użyciu opcji NEAR. Wartość rangi każdego zwróconego wiersza jest oparta na kilku parametrach. Jednym z głównych czynników klasyfikacji jest całkowita liczba dopasowań (lub trafień) w stosunku do długości dokumentu. W związku z tym, jeśli na przykład dokument o długości 100 słów i dokument o długości 900 słów zawierają identyczne dopasowania, dokument o długości 100 słów jest klasyfikowany wyżej.

Łączna długość każdego trafienia z rzędu przyczynia się również do klasyfikacji tego wiersza na podstawie odległości między pierwszym i ostatnimi terminami wyszukiwania tego trafienia. Im mniejsza odległość, tym bardziej trafienie przyczynia się do wartości rangi wiersza. Jeśli zapytanie pełnotekstowe nie określa maksymalnej odległości jako liczby całkowitej, dokument zawierający wyłącznie trafienia, których odległości są większe niż 100 terminów logicznych, ma rangę 0.

Ranga ISABOUT

CONTAINSTABLE obsługuje wykonywanie zapytań dotyczących terminów ważonych przy użyciu opcji ISABOUT. ISABOUT to zapytanie dotyczące przestrzeni wektorowej w tradycyjnej terminologii pobierania informacji. Domyślny używany algorytm klasyfikacji to Jaccard, powszechnie znana formuła. Ranking jest obliczany dla każdego terminu w zapytaniu, a następnie są łączone, jak opisano w poniższym algorytmie.

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 ) )

Ranga dla FREETEXTTABLE

FREETEXTTABLE ranking opiera się na formule rankingu OKAPI BM25. FREETEXTTABLE zapytania dodają do zapytania słowa poprzez generowanie form fleksyjnych (formy odmienione oryginalnych słów zapytania). Te słowa traktowane są jako odrębne słowa, bez szczególnego związku ze słowami, z których zostały wygenerowane. Synonimy wygenerowane na podstawie funkcji Thesaurus są traktowane jako oddzielne, równie ważone terminy. Każde słowo w zapytaniu przyczynia się do rangi.

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.