Sdílet prostřednictvím


Omezení výsledků hledání pomocí RANK

platí pro:SQL ServerAzure SQL Databaseazure SQL Managed Instance

Funkce CONTAINSTABLE a FREETEXTTABLE vrátí sloupec s názvem RANK, který obsahuje pořadové hodnoty od 0 do 1000 (hodnoty pořadí). Tyto hodnoty slouží k řazení vrácených řádků podle toho, jak dobře odpovídají kritériím výběru. Hodnoty pořadí označují pouze relativní pořadí relevance řádků v sadě výsledků s nižší hodnotou označující nižší relevanci. Skutečné hodnoty nejsou důležité a obvykle se liší při každém spuštění dotazu.

Poznámka

Predikáty CONTAINS a FREETEXT nevrací žádné hodnoty pořadí.

Počet položek odpovídajících hledané podmínce je často velký. Pokud chcete zabránit tomu, aby dotazy CONTAINSTABLE nebo FREETEXTTABLE vracely příliš mnoho shod, použijte volitelný parametr top_n_by_rank, který vrací pouze podmnožinu řádků. top_n_by_rank je celočíselná hodnota, n, která určuje, že v sestupném pořadí se vrátí pouze n nejvýše hodnocených shod. Pokud se top_n_by_rank zkombinuje s jinými parametry, dotaz by mohl vrátit méně řádků než počet řádků, které ve skutečnosti odpovídají všem predikátům.

SQL Server řadí shody podle hodnocení a vrátí pouze stanovený počet řádků. Výsledkem této volby může být výrazný nárůst výkonu. Například dotaz, který by normálně vrátil 100 000 řádků z tabulky 1 000 000 řádků, se zpracuje rychleji, pokud se požaduje pouze prvních 100 řádků.

Příklady použití funkce RANK k omezení výsledků hledání

Příklad A: Hledání pouze prvních tří shod

Následující příklad používá CONTAINSTABLE k vrácení pouze prvních tří shod.

USE AdventureWorks2022;
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

Tady je sada výsledků.

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

Příklad B: Hledání pěti nejlepších shod

Následující příklad používá CONTAINSTABLE k vrácení popisu prvních pěti produktů, kde sloupec Description obsahuje slovo "hliník" poblíž slova light nebo slovo lightweight.

USE AdventureWorks2022;
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 jsou výsledky vyhledávacího dotazu seřazené

Fulltextové vyhledávání v SQL Serveru může vygenerovat volitelné skóre (nebo hodnotu pořadí), které označuje význam dat vrácených fulltextovým dotazem. Tato hodnota pořadí se počítá na každém řádku a dá se použít jako kritéria řazení k seřazení sady výsledků daného dotazu podle relevance. Hodnoty pořadí označují pouze relativní pořadí relevance řádků v sadě výsledků. Skutečné hodnoty nejsou důležité a obvykle se liší při každém spuštění dotazu. Hodnota pořadí neobsahuje žádný význam napříč dotazy.

Statistika pro řazení

Při vytváření indexu se shromažďují statistiky pro použití v řazení. Proces vytvoření fulltextového katalogu nemá přímo za následek jednu strukturu indexu. Místo toho modul Full-Text pro SQL Server vytváří zprostředkující indexy při indexování dat. Modul Full-Text pak tyto indexy podle potřeby sloučí do většího indexu. Tento proces se může mnohokrát opakovat. Modul Full-Text pak provede "hlavní sloučení," které zkombinuje všechny zprostředkující indexy do jednoho velkého hlavního indexu.

Statistiky se shromažďují na každé zprostředkující úrovni indexu. Statistiky se sloučí při sloučení indexů. Některé statistické hodnoty lze vygenerovat pouze během hlavního procesu sloučení.

Zatímco SQL Server řadí sadu výsledků dotazu, používá statistiky z největšího zprostředkujícího indexu. To závisí na tom, zda jsou zprostředkující indexy sloučeny, nebo ne. V důsledku toho se statistiky řazení můžou lišit v přesnosti, pokud se střední indexy nesloučí. Vysvětluje, proč stejný dotaz může v průběhu času vrátit různé výsledky pořadí, protože se přidávají, upravují a odstraňují fulltextová data a sloučí se menší indexy.

Aby se minimalizovala velikost indexu a výpočetní složitosti, statistiky se často zaokrouhlují.

Následující seznam obsahuje některé běžně používané termíny a statistické hodnoty, které jsou důležité při výpočtu pořadí.

Termín nebo hodnota Popis
Vlastnost Fulltextový indexovaný sloupec řádku
dokument Entita vrácená v dotazech. V SQL Serveru to odpovídá řádku. Dokument může mít více vlastností, stejně jako řádek může mít více fulltextových indexovaných sloupců.
Index Jeden invertovaný index jednoho nebo více dokumentů To může být zcela v paměti nebo na disku. Mnoho statistik dotazů je relativní vzhledem k jednotlivým indexům, ve kterých došlo ke shodě.
Full-Text katalog Kolekce zprostředkujících indexů se pro dotazy považuje za jednu entitu. Katalogy jsou jednotkou organizace, která je viditelná pro správce SQL Serveru.
Slovo, token nebo položka Jednotka porovnávání v modulu fulltextového vyhledávání. Textové proudy z dokumentů se tokenizují na slova nebo tokeny pomocí jazykově specifických děličů slov.
výskytu Posun slova ve vlastnosti dokumentu, jak určuje oddělovač slov. První slovo je ve výskytu 1, další na 2 atd. Aby se zabránilo falešně pozitivním výsledkům v dotazech na frázi a blízkost, konec věty a konec odstavce způsobují větší mezery ve výskytech.
Frekvence termínu Počet výskytů hodnoty klíče v řádku.
početIndexovanýchŘádků Celkový počet indexovaných řádků Vypočítá se to na základě počtu udržovaných v průběžných indexech. Toto číslo se může lišit v přesnosti.
KeyRowCount Celkový počet řádků v fulltextovém katalogu, které obsahují daný klíč.
MaxVýskyt Největší výskyt uložený v fulltextovém katalogu pro zadanou vlastnost v daném řádku.
MaxQueryRank Maximální hodnota pořadí, 1000, vrácená strojem Full-Text.

Problémy s výpočty pořadí

Proces výpočetního pořadí závisí na mnoha faktorech. Analyzátory slov různých jazyků tokenizují text odlišně. Například řetězec "pes-dům" může být rozdělen na "pes" "dům" jedním slovním rozdělovačem a na "pes-dům" jiným. To znamená, že porovnávání a řazení se liší podle zadaného jazyka, protože se liší nejen slova, ale i délka dokumentu. Rozdíl délky dokumentu může ovlivnit řazení pro všechny dotazy.

Statistiky, jako je IndexRowCount, se mohou značně lišit. Pokud má například katalog v hlavním indexu 2 miliardy řádků a nový dokument se indexuje do zprostředkujícího indexu v paměti, pak pořadí tohoto dokumentu, založené na počtu dokumentů v paměťovém indexu, může být zkreslené ve srovnání s pořadím dokumentů z hlavního indexu. Z tohoto důvodu doporučujeme, aby se po každé operaci, která vede k indexování nebo přeindexování velkého počtu řádků, indexy sloučily do hlavního indexu pomocí příkazu ALTER FULLTEXT CATALOG ... REORGANIZE Transact-SQL. Modul Full-Text také automaticky sloučí indexy na základě parametrů, jako je počet a velikost zprostředkujících indexů.

hodnoty MaxOccurrence jsou normalizovány do 1 z 32 rozsahů. To znamená, že dokument s délkou 50 slov se například považuje za dokument o délce 100 slov. Následuje tabulka použitá pro normalizaci. Vzhledem k tomu, že délky dokumentu jsou v rozsahu mezi sousedními hodnotami tabulky 32 a 128, jsou efektivně považovány za stejné délky, 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 };

Pořadí CONTAINSTABLE

CONTAINSTABLE pořadí používá následující algoritmus:

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

Shody frází jsou seřazené stejně jako jednotlivé klíče s tím rozdílem, že KeyRowCount (počet řádků obsahujících frázi) je odhadnut a může být nepřesný a vyšší než skutečné číslo.

Pořadí v NEAR

CONTAINSTABLE podporuje dotazování dvou nebo více hledaných termínů v blízkosti k sobě pomocí možnosti NEAR. Hodnota pořadí každého vráceného řádku je založená na několika parametrech. Jedním z hlavních faktorů řazení je celkový počet shod (nebo hitů) vzhledem k délce dokumentu. Pokud například 100 wordový dokument a 900 wordový dokument obsahují identické shody, bude 100 wordový dokument seřazený výš.

Celková délka jednotlivých zásahů v řádku také přispívá k hodnocení tohoto řádku na základě vzdálenosti mezi prvním a posledním hledaným termínem tohoto zásahu. Čím menší je vzdálenost, tím více hit přispívá k hodnotě pořadí řádku. Pokud fulltextový dotaz nezadá celé číslo jako maximální vzdálenost, má dokument, který obsahuje pouze hity, jejichž vzdálenosti jsou větší než 100 logických termínů od sebe, má pořadí 0.

Pořadí ISABOUT

CONTAINSTABLE podporuje dotazování na vážené termíny pomocí možnosti ISABOUT. ISABOUT je vektorový dotaz v tradiční terminologii vyhledávání informací. Výchozí algoritmus řazení je Jaccard, široce známý vzorec. Pořadí se vypočítá pro každý termín v dotazu a pak se zkombinuje, jak je popsáno v následujícím algoritmu.

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

Pořadí FREETEXTTABLE

HODNOCENÍ FREETEXTTABLE je založeno na hodnocení podle vzorce OKAPI BM25. FREETEXTTABLE dotazy přidávají do dotazu slova prostřednictvím generování podle skloňování (skloňované tvary původních dotazových slov); tato slova se považují za samostatná slova, aniž by měla zvláštní vztah ke slovům, ze kterých byla vytvořena. Synonyma generovaná funkcí Tesaurus jsou považována za samostatné, stejně vážené termíny. Každé slovo v dotazu přispívá k pořadí.

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.
  • dotaz pomocí hledání Full-Text