Begränsa sökresultat med RANK
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Funktionerna CONTAINSTABLE och FREETEXTTABLE returnerar en kolumn med namnet RANK
som innehåller ordningstal från 0 till 1 000 (rangvärden). Dessa värden används för att rangordna de rader som returneras enligt hur väl de matchar urvalskriterierna. Rankningsvärdena anger endast en relativ relevansordning för raderna i resultatuppsättningen, med ett lägre värde som anger lägre relevans. De faktiska värdena är oviktiga och skiljer sig vanligtvis varje gång frågan körs.
Obs
De CONTAINS
- och FREETEXT
predikaten returnerar inte några rangvärden.
Antalet objekt som matchar ett sökvillkor är ofta stort. Om du vill förhindra att CONTAINSTABLE
eller FREETEXTTABLE
frågor returnerar för många matchningar använder du den valfria parametern top_n_by_rank, som endast returnerar en delmängd rader.
top_n_by_rank är ett heltalsvärde, n, som anger att endast n högst rankade matchningar ska returneras i fallande ordning. Om top_n_by_rank kombineras med andra parametrar kan frågan returnera färre rader än antalet rader som faktiskt matchar alla predikat.
SQL Server beställer matchningarna efter rangordning och returnerar endast upp till det angivna antalet rader. Det här valet kan leda till en dramatisk ökning av prestanda. Till exempel bearbetas en fråga som normalt returnerar 100 000 rader från en tabell med 1 000 000 rader snabbare om endast de översta 100 raderna begärs.
Exempel på hur du använder RANK för att begränsa sökresultat
Exempel A: Söker bara efter de tre bästa matchningarna
I följande exempel används CONTAINSTABLE
för att endast returnera de tre bästa matchningarna.
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
Här är resultatet.
RANK Address City
----------- -------------------------------- ------------------------------
172 9005, rue des Bouchers Paris
172 5, rue des Bouchers Orleans
172 5, rue des Bouchers Metz
Exempel B: Söka efter de fem bästa matchningarna
I följande exempel används CONTAINSTABLE
för att returnera beskrivningen av de fem främsta produkterna där kolumnen Description
innehåller ordet "aluminium" nära antingen ordet light
eller ordet 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
Så rangordnas sökresultat för sökfrågor
Fulltextsökning i SQL Server kan generera en valfri poäng (eller rangvärde) som anger relevansen för data som returneras av en fulltextfråga. Det här rankningsvärdet beräknas på varje rad och kan användas som ett ordningsvillkor för att sortera resultatuppsättningen för en viss fråga efter relevans. Rankningsvärdena anger endast en relativ relevansordning för raderna i resultatuppsättningen. De faktiska värdena är oviktiga och skiljer sig vanligtvis varje gång frågan körs. Rangvärdet har ingen betydelse för frågor.
Statistik för rangordning
När ett index skapas samlas statistik in för användning i rangordning. Processen att skapa en fulltextkatalog resulterar inte direkt i en enda indexstruktur. I stället skapar Full-Text Engine för SQL Server mellanliggande index när data indexeras. Den Full-Text motorn sammanfogar sedan dessa index till ett större index efter behov. Den här processen kan upprepas många gånger. Full-Text Engine utför sedan en "huvudsammanslagning" som kombinerar alla mellanliggande index till ett stort huvudindex.
Statistik samlas in på varje mellanliggande indexnivå. Statistiken sammanfogas när indexen slås samman. Vissa statistiska värden kan bara genereras under huvudsammanslagningsprocessen.
Sql Server rangordnar en frågeresultatuppsättning, men använder statistik från det största mellanliggande indexet. Detta beror på om mellanliggande index sammanfogas eller inte. Därför kan rangordningsstatistiken variera i noggrannhet om de mellanliggande indexen inte slås samman. Detta förklarar varför samma fråga kan returnera olika rankningsresultat över tid när fulltextindexerade data läggs till, ändras och tas bort och när de mindre indexen sammanfogas.
För att minimera storleken på indexet och beräkningskomplexiteten avrundas statistiken ofta.
Följande lista innehåller några vanliga termer och statistiska värden som är viktiga vid beräkning av rangordning.
Term/värde | Beskrivning |
---|---|
egenskap | En fulltextindexerad kolumn i raden. |
Dokument | Entiteten som returneras i sökfrågor. I SQL Server motsvarar detta en rad. Ett dokument kan ha flera egenskaper, precis som en rad kan ha flera fulltextindexerade kolumner. |
Index | Ett enda inverterat index för ett eller flera dokument. Detta kan vara helt i minnet eller på disken. Många frågestatistik är relativa till det enskilda index där matchningen inträffade. |
Full-Text Katalog | En samling mellanliggande index som behandlas som en entitet för frågor. Kataloger är den organisationsenhet som är synlig för SQL Server-administratören. |
Word, token eller objekt | Enheten för matchning i fulltextmotorn. Strömmar av text från dokument tokeniseras till ord eller tokens av språkspecifika ordbrytare. |
förekomst | Ordförskjutning i en dokumentegenskap som bestäms av ordbrytaren. Det första ordet är vid förekomst 1, nästa vid 2 och så vidare. För att undvika falska positiva identifieringar i fras- och närhetsfrågor medför luckor i slutet av meningen och slutet av stycket större förekomstluckor. |
Termfrekvens | Antalet gånger nyckelvärdet inträffar på en rad. |
IndexedRowCount | Totalt antal rader som indexerats. Detta beräknas baserat på räknade värden som bevaras i de mellanliggande indexen. Det här antalet kan variera i noggrannhet. |
KeyRowCount | Totalt antal rader i fulltextkatalogen som innehåller en viss nyckel. |
MaxFörekomst | Den största förekomsten som lagras i en fulltextkatalog för en viss egenskap på en rad. |
MaxQueryRank | Den högsta rangordningen, 1 000, som returneras av Full-Text Engine. |
Problem med rankningsberäkning
Processen för databehandlingsrankning beror på många faktorer. Ordbrytare med olika språk tokeniserar text på olika sätt. Till exempel kan strängen "dog-house" delas upp till "hund" "hus" av en ordbrytare och till "hundhus" av en annan. Det innebär att matchning och rangordning varierar beroende på det angivna språket, eftersom inte bara orden är olika, utan även dokumentlängden. Dokumentlängdsskillnaden kan påverka rangordningen för alla frågor.
Statistik som IndexRowCount kan variera kraftigt. Om en katalog till exempel har 2 miljarder rader i huvudindexet, indexeras ett nytt dokument in i ett mellanliggande index i minnet, och rankningen för det dokumentet, som baseras på antalet dokument i det mellanliggande indexet, kan bli snedvriden jämfört med rankningen för dokument från huvudindexet. Därför rekommenderar vi att du efter någon population som resulterar i ett stort antal rader indexeras eller omindexeras, sammanfogar indexen till ett huvudindex med hjälp av ALTER FULLTEXT CATALOG ... REORGANIZE
Transact-SQL-uttrycket. Full-Text Engine sammanfogar också indexen automatiskt baserat på parametrar som antalet och storleken på mellanliggande index.
MaxOccurrence värden normaliseras till 1 av 32 intervall. Det innebär till exempel att ett dokument som är 50 ord långt behandlas på samma sätt som ett dokument som är 100 ord långt. Följande är tabellen som används för normalisering. Eftersom dokumentlängderna ligger i intervallet mellan de intilliggande tabellvärdena 32 och 128 behandlas de effektivt med samma längd, 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 };
Rangordning för CONTAINSTABLE
CONTAINSTABLE- rangordning använder följande algoritm:
StatisticalWeight = Log2( ( 2 + IndexedRowCount ) / KeyRowCount )
Rank = min( MaxQueryRank, HitCount * 16 * StatisticalWeight / MaxOccurrence )
Frasmatchningar rangordnas precis som enskilda nycklar förutom att KeyRowCount- (antalet rader som innehåller frasen) uppskattas och kan vara felaktiga och högre än det faktiska talet.
Rangordning för NEAR
CONTAINSTABLE
stöder frågor om två eller flera sökord i närheten av varandra med hjälp av alternativet NEAR
. Rangvärdet för varje returnerad rad baseras på flera parametrar. En viktig rangordningsfaktor är det totala antalet matchningar (eller träffar) i förhållande till dokumentets längd. Om till exempel ett dokument med 100 ord och ett 900-ordsdokument innehåller identiska matchningar rangordnas dokumentet med 100 ord högre.
Den totala längden på varje träff i en rad bidrar också till rangordningen av den raden, baserat på avståndet mellan den första och sista söktermen för träffen. Ju mindre avstånd desto mer bidrar träffen till radens rangvärde. Om en fulltextfråga inte anger ett heltal som maximalt avstånd, har ett dokument som endast innehåller träffar vars avstånd är större än 100 logiska termer ifrån varandra en rangordning på 0.
Rangordning för ISABOUT
CONTAINSTABLE
stöder frågor om viktade termer med hjälp av alternativet ISABOUT
.
ISABOUT
är en vektor-rymdfråga i traditionell informationshämtningsterminologi. Standardrankningsalgoritmen som används är Jaccard, en allmänt känd formel. Rangordningen beräknas för varje term i frågan och kombineras sedan enligt beskrivningen i följande algoritm.
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 ) )
Rankning av FREETEXTTABLE
FREETEXTTABLE ranking baseras på rankningsformeln OKAPI BM25.
FREETEXTTABLE
sökfrågor lägger till ord i frågan genom böjningsgenerering (böjda former av de ursprungliga sökfrågeorden); dessa ord behandlas som separata ord, utan någon särskild relation till de ord som de genererades från. Synonymer som genereras från thesaurus-funktionen behandlas som separata, lika viktade termer. Varje ord i frågan bidrar till rangordningen.
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.