Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Funktionerna CONTAINSTABLE och FREETEXTTABLE returnerar en kolumn med namn RANK som innehåller ordningsvärden från 0 till 1 000 (rankvärden). Dessa värden rangordnar raderna efter 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. För att förhindra att frågor med CONTAINSTABLE eller FREETEXTTABLE returnerar för många träffar använder du den valfria parametern top_n_by_rank. Den returnerar endast en delmängd av raderna.
top_n_by_rank är ett heltalsvärde, n, som anger att endast de n högst rankade matcherna 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.
Databasmotor för SQL Server ordnar matcherna efter rang och returnerar endast upp till det angivna antalet rader. Till exempel behandlas 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 efterfrågas.
Exempel på att använda 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 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
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 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
Så rangordnas sökresultat för sökfrågor
Fulltextsökning kan generera ett valfritt poäng (eller rankningsvärde) som anger relevansen av de data som returneras av en fulltextfråga. Detta rankningsvärde beräknas på varje rad och kan användas som ett ordningskriterium för att sortera resultatmängden för en given 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 du bygger ett index samlar systemet in statistik för att använda i rankingen. Att bygga en fulltextkatalog skapar inte direkt en enda indexstruktur. Istället skapar Full-Text Engine mellanliggande index när den indexerar data. Den Full-Text motorn sammanfogar sedan dessa index till ett större index efter behov. Denna process kan ske 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.
Medan Database Engine rankar en frågeresultatuppsättning använder den statistik från det största mellanliggande indexet. Denna användning beror på om mellanliggande index slås samman. Därför kan rangordningsstatistiken variera i noggrannhet om de mellanliggande indexen inte slås samman. Denna skillnad i noggrannhet förklarar varför samma fråga kan ge olika rankningsresultat över tid när fulltextindexerad data läggs till, ändras och tas bort, och när de mindre indexen slås samman.
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 Database Engine 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 vad administratörer ser som organisationens enhet. |
| Word, token eller föremål | Enheten för matchning i fulltextmotorn. Textströmmar 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 träffar i fras- och närhetssökningar medför meningsslut och styckeslut större avstånd mellan förekomster. |
| Termfrekvens | Antalet gånger nyckelvärdet förekommer i rad. |
| IndexedRowCount | Totalt antal rader som indexerats. Detta värde beräknas baserat på antal som underhålls i mellanindexen. 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 rangen, 1000, returnerades av Full-Text Engine. |
Problem med rankningsberäkning
Många faktorer påverkar processen att beräkna rang. Ordbrytare med olika språk tokeniserar text på olika sätt. Till exempel delar en ordavgränsare upp strängen "dog-house" i "dog" och "house", medan en annan ordavgränsare betraktar den som "dog-house". Matchning och rangordning varierar beroende på vilket språk som anges, eftersom inte bara orden skiljer sig utan även dokumentets längd. Dokumentlängdsskillnaden kan påverka rangordningen för alla frågor.
Statistik som IndexRowCount kan variera kraftigt. Till exempel, om en katalog har 2 miljarder rader i huvudindexet, indexeras ett nytt dokument i ett mellanliggande index i minnet, och rangordningar för det dokumentet baserat på antalet dokument i minnesindexet kan vara snedvridna jämfört med rangordningar för dokument från huvudindexet. Av denna anledning, efter varje population som resulterar i att ett stort antal rader indexeras eller omindexeras, slås indexen samman till ett huvudindex genom att använda ALTER FULLTEXT CATALOG ... REORGANIZE Transact-SQL-satsen. 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. Denna normalisering innebär till exempel att ett dokument på 50 ord behandlas på samma sätt som ett dokument på 100 ord. Följande tabell visar normaliseringen. 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 rankas precis som enskilda nycklar, förutom att KeyRowCount (antalet rader som innehåller frasen) är ett uppskattat värde som kan vara felaktigt och högre än det faktiska antalet.
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 med större avstånd än 100 logiska termer från varandra rangordningen 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 Frågor lägger till ord i frågan genom böjningsgenerering (böjda former av de ursprungliga frågeorden). Dessa ord behandlas som separata ord, utan någon särskild koppling till de ord de är skapade 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.