Zoekresultaten beperken met RANK

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

De functies CONTAINSTABLE en FREETEXTTABLE geven een kolom terug met de naam RANK die ordinale waarden bevat van 0 tot en met 1.000 (rangwaardes). Deze waarden rangschikken de rijen op basis van hoe goed ze voldoen aan de selectiecriteria. De rangschikkingswaarden geven alleen een relatieve volgorde van relevantie aan van de rijen in de resultatenset, met een lagere waarde die een lagere relevantie aangeeft. De werkelijke waarden zijn onbelangrijk en verschillen meestal elke keer dat de query wordt uitgevoerd.

Notitie

De CONTAINS en FREETEXT predicaten retourneren geen rangwaarden.

Het aantal items dat overeenkomt met een zoekvoorwaarde is vaak groot. Om te voorkomen dat CONTAINSTABLE- of FREETEXTTABLE-zoekopdrachten te veel overeenkomsten retourneren, gebruik je de optionele parameter top_n_by_rank. Het geeft slechts een deelverzameling van rijen terug. top_n_by_rank is een geheel getal, n, die aangeeft dat alleen de n hoogst gerangschikte matches worden teruggegeven, in aflopende volgorde. Als top_n_by_rank wordt gecombineerd met andere parameters, kan de query minder rijen retourneren dan het aantal rijen dat daadwerkelijk overeenkomt met alle predicaten.

De SQL Server Database Engine ordent de matches op rang en geeft slechts een gegeven aantal rijen terug. Bijvoorbeeld, een query die normaal gesproken 100.000 rijen teruggeeft uit een tabel met 1.000.000 rijen wordt sneller verwerkt als alleen de bovenste 100 rijen worden aangevraagd.

Voorbeelden van het gebruik van RANK om zoekresultaten te beperken

Voorbeeld A: alleen zoeken naar de drie belangrijkste overeenkomsten

In het volgende voorbeeld wordt CONTAINSTABLE gebruikt om alleen de top drie overeenkomsten te retourneren.

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

Hier zijn de resultaten.

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

Voorbeeld B: Zoeken naar de top vijf resultaten

In het volgende voorbeeld wordt CONTAINSTABLE gebruikt om de beschrijving van de top vijf producten te retourneren waarbij de kolom Description het woord "aluminium" bevat in de buurt van het woord light of het woord 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

Hoe zoekresultaten worden gerangschikt

Full-text search kan een optionele score (of rangwaarde) genereren die de relevantie aangeeft van de gegevens die door een full-text query worden teruggegeven. Deze rangwaarde wordt op elke rij berekend en kan worden gebruikt als ordeningscriterium om de resultaatset van een gegeven query op relevantie te sorteren. De rangschikkingswaarden geven alleen een relatieve volgorde van relevantie aan van de rijen in de resultatenset. De werkelijke waarden zijn onbelangrijk en verschillen doorgaans telkens wanneer de query wordt uitgevoerd. De rangschikkingswaarde heeft geen betekenis voor query's.

Statistieken voor rangschikking

Wanneer je een index opbouwt, verzamelt het systeem statistieken om te gebruiken in de rangschikking. Het bouwen van een full-text catalogus creëert niet direct een enkele indexstructuur. In plaats daarvan maakt de Full-Text Engine tussentijdse indexen aan terwijl hij data indexeert. De Full-Text Engine voegt deze indexen vervolgens indien nodig samen in een grotere index. Dit proces kan meerdere keren gebeuren. De Full-Text Engine voert vervolgens een 'hoofdsamenvoeging' uit die alle tussenliggende indexen combineert tot één grote hoofdindex.

Statistieken worden verzameld op elk tussenliggend indexniveau. De statistieken worden samengevoegd wanneer de indexen worden samengevoegd. Sommige statistische waarden kunnen alleen worden gegenereerd tijdens het hoofdsamenvoegproces.

Hoewel de Database Engine een zoekresultatenset rangschikt, gebruikt deze statistieken van de grootste tussenindex. Dit gebruik hangt af van de vraag of intermediaire indexen worden samengevoegd. Als gevolg hiervan kunnen classificatiestatistieken in nauwkeurigheid variëren als de tussenliggende indexen niet worden samengevoegd. Dit verschil in nauwkeurigheid verklaart waarom dezelfde zoekopdracht in de loop van de tijd verschillende rangresultaten kan opleveren naarmate full-text geïndexeerde gegevens worden toegevoegd, aangepast en verwijderd, en naarmate de kleinere indexen worden samengevoegd.

Om de grootte van de index en de complexiteit van de berekening te minimaliseren, worden statistieken vaak afgerond.

De volgende lijst bevat enkele veelgebruikte termen en statistische waarden die belangrijk zijn bij het berekenen van rang.

Term/waarde Beschrijving
eigenschap Een kolom van de rij met full-text indexering.
Document De entiteit die wordt geretourneerd in queries. In de Database Engine komt dit overeen met een rij. Een document kan meerdere eigenschappen hebben, net zoals een rij meerdere geïndexeerde kolommen met volledige tekst kan hebben.
Index Eén omgekeerde index van een of meer documenten. Dit kan volledig in het geheugen of op schijf zijn. Veel querystatistieken zijn gerelateerd aan de afzonderlijke index waar de overeenkomst plaatsvond.
Full-Text Catalogus Een verzameling tussenliggende indexen die worden behandeld als één entiteit voor query's. Catalogi zijn wat beheerders zien als de eenheid van organisatie.
Woord, token of item De eenheid van overeenkomende tekst in de engine voor volledige tekst. Tekststromen uit documenten worden door taalspecifieke woordbrekers getokeniseerd tot woorden of tokens.
Voorkomen Het woord wordt verschoven in een documenteigenschap zoals bepaald door de woordonderbreker. Het eerste woord is op positie 1, het volgende op 2, en zo verder. Om valse positieven in frase- en nabijheidsvragen te voorkomen, introduceren einde van zin en einde van alinea grotere lacunes in voorkomst.
Termfrequentie- Het aantal keren dat de sleutelwaarde achter elkaar voorkomt.
IndexedRowCount- Totaal aantal geïndexeerde rijen. Deze waarde wordt berekend op basis van tellingen die in de tussenliggende indexen worden bijgehouden. Dit getal kan variëren in nauwkeurigheid.
KeyRowCount Totaal aantal rijen in de catalogus met volledige tekst die een bepaalde sleutel bevatten.
MaxOccurrence Het grootste voorkomen dat is opgeslagen in een voltekstcatalogus voor een bepaalde eigenschap in een rij.
MaxQueryRank- De maximale rang, 1000, teruggegeven door de Full-Text Engine.

Problemen met rangschikkingsberekeningen

Veel factoren beïnvloeden het proces van het berekenen van rang. Verschillende taaltermonderbrekers tokeniseren tekst anders. Zo breekt de ene woordbreker de reeks "dog-house" in "dog" en "house", maar een andere woordbreker behandelt het als "dog-house". Matching en rangschikking variëren afhankelijk van de gespecificeerde taal, omdat niet alleen de woorden verschillen, maar ook de documentlengte. Het verschil in de lengte van het document kan van invloed zijn op de rangorde voor alle query's.

Statistieken zoals IndexRowCount kunnen sterk variëren. Als een catalogus bijvoorbeeld 2 miljard rijen heeft in de masterindex, wordt één nieuw document geïndexeerd in een in-memory tussenindex, en kunnen rangen voor dat document op basis van het aantal documenten in de in-memory index scheef zijn vergeleken met rangen voor documenten uit de masterindex. Om deze reden moet u na elke populatie waarbij een groot aantal rijen wordt geïndexeerd of opnieuw geïndexeerd, de indexen met behulp van de ALTER FULLTEXT CATALOG ... REORGANIZE Transact-SQL-instructie samenvoegen tot één hoofdindex. De Full-Text Engine voegt ook automatisch de indexen samen op basis van parameters zoals het aantal en de grootte van tussenliggende indexen.

MaxOccurrence waarden worden genormaliseerd in 1 van 32 reeksen. Deze normalisatie betekent bijvoorbeeld dat een document van 50 woorden hetzelfde wordt behandeld als een document van 100 woorden. De volgende tabel toont de normalisatie. Omdat de documentlengten zich in het bereik tussen aangrenzende tabelwaarden 32 en 128 bevinden, worden ze effectief behandeld als dezelfde lengte, 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 };

Rang van CONTAINSTABLE

CONTAINSTABLE rangschikking maakt gebruik van het volgende algoritme:

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

Overeenkomsten van woordgroepen worden net als afzonderlijke sleutels gerangschikt, behalve dat KeyRowCount (het aantal rijen dat de woordgroep bevat) een geschatte waarde is die onnauwkeurig kan zijn en hoger kan uitvallen dan het werkelijke aantal.

Ranglijst van NEAR

CONTAINSTABLE ondersteunt het uitvoeren van query's op twee of meer zoektermen in nabijheid met elkaar met behulp van de optie NEAR. De rangschikkingswaarde van elke geretourneerde rij is gebaseerd op verschillende parameters. Een belangrijke classificatiefactor is de totale hoeveelheid overeenkomsten (of treffers) ten opzichte van de lengte van het document. Als bijvoorbeeld een 100-word-document en een 900-word-document identieke overeenkomsten bevatten, wordt het 100-word-document hoger gerangschikt.

De totale lengte van elke treffer in een rij draagt ook bij aan de rangorde van die rij, op basis van de afstand tussen de eerste en laatste zoektermen van die hit. Hoe kleiner de afstand, hoe meer de hit bijdraagt aan de rangschikkingswaarde van de rij. Als een full-text query geen geheel getal als maximale afstand specificeert, heeft een document dat alleen hits bevat waarvan de afstanden groter zijn dan 100 logische termen uit elkaar een rangschikking van 0.

Rang van ISABOUT

CONTAINSTABLE ondersteunt het uitvoeren van query's op gewogen termen met behulp van de optie ISABOUT. ISABOUT is een vectorruimtequery in traditionele terminologie voor het ophalen van gegevens. Het standaardalgoritme voor classificatie is Jaccard, een veelgebruikte formule. De classificatie wordt berekend voor elke term in de query en vervolgens gecombineerd, zoals beschreven in het volgende algoritme.

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

Positie van FREETEXTTABLE

FREETEXTTABLE rangschikking is gebaseerd op de Okapi BM25-rangschikkingsformule. FREETEXTTABLE Zoekopdrachten voegen woorden toe aan de zoekopdracht via verbuigingsgeneratie (verbuigde vormen van de oorspronkelijke zoekwoorden). Deze woorden worden behandeld als aparte woorden, zonder speciale relatie met de woorden waaruit ze zijn voortgekomen. Synoniemen die zijn gegenereerd op basis van de synoniemenlijstfunctie, worden beschouwd als afzonderlijke, even gewogen termen. Elk woord in de query draagt bij aan de rangschikking.

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.