Einschränken von Suchergebnissen mit RANG

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Die Funktionen CONTAINSTABLE und FREETEXTTABLE geben eine Spalte zurück RANK , die Ordnungswerte von 0 bis 1000 (Rangwerte) enthält. Diese Werte werden verwendet, um die Rangfolge der zurückgegebenen Zeilen gemäß ihrer Übereinstimmung mit den Auswahlkriterien festzulegen. Die Rangwerte geben lediglich eine relative Relevanzreihenfolge der Zeilen im Resultset an, wobei ein niedrigerer Wert eine niedrigere Relevanz anzeigt. Die tatsächlichen Werte sind nicht von Bedeutung und unterscheiden sich i. d. R. bei jeder Ausführung der Abfrage.

Hinweis

Die CONTAINS Prädikate FREETEXT geben keine Rangwerte zurück.

Die Anzahl der Elemente, die einer Suchbedingung entsprechen, ist häufig groß. Um zu verhindern, FREETEXTTABLE dass CONTAINSTABLE zu viele Übereinstimmungen zurückgegeben werden, verwenden Sie den optionalen top_n_by_rank-Parameter, der nur eine Teilmenge von Zeilen zurückgibt. top_n_by_rank ist ein ganzzahliger Wert, n, der angibt, dass nur die n höchsten Übereinstimmungen zurückgegeben werden sollen, in absteigender Reihenfolge. Wenn top_n_by_rank mit anderen Parametern kombiniert wird, werden von der Abfrage möglicherweise weniger Zeilen zurückgegeben als die Anzahl von Zeilen, die mit allen Prädikaten übereinstimmen.

SQL Server sortiert die Übereinstimmungen nach Rang und gibt nur bis zur angegebenen Anzahl von Zeilen zurück. Diese Einschränkung kann zu einer deutlichen Leistungssteigerung führen. Eine Abfrage, die normalerweise 100.000 Zeilen aus einer Tabelle mit 1.000.000 Zeilen zurückgibt, wird schneller verarbeitet, wenn nur die obersten 100 Zeilen angefordert werden.

Beispiele für die Verwendung von RANK zum Einschränken von Suchergebnissen

Beispiel A: Suchen nach ausschließlich den obersten drei Übereinstimmungen

Im folgenden Beispiel werden CONTAINSTABLE nur die drei obersten Übereinstimmungen zurückgegeben.

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

Hier ist das Resultset.

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

Beispiel B: Suchen nach den fünf besten Übereinstimmungen

Im folgenden Beispiel wird CONTAINSTABLE die Beschreibung der fünf obersten Produkte zurückgegeben, bei denen die Description Spalte das Wort "Aluminium" in der Nähe des Worts light oder des Worts lightweightenthält.

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

Rangfolge von Suchergebnissen für Suchabfragen

Die Volltextsuche in SQL Server kann eine optionale Bewertung (oder rangfolgenwert) generieren, die die Relevanz der von einer Volltextabfrage zurückgegebenen Daten angibt. Dieser Rangwert wird für jede Zeile berechnet und als Sortierkriterium verwendet, um das Resultset einer bestimmten Abfrage nach Relevanz zu sortieren. Die Rangwerte geben lediglich eine relative Relevanzreihenfolge der Zeilen im Resultset an. Die tatsächlichen Werte sind nicht von Bedeutung und unterscheiden sich i. d. R. bei jeder Ausführung der Abfrage. Der Rangwert enthält keine Bedeutung für Abfragen.

Statistiken für die Rangfolge

Beim Erstellen eines Indexes werden Statistiken für die Reihenfolgebestimmung gesammelt. Der Prozess der Erstellung eines Volltextkatalogs führt nicht direkt zu einer einzelnen Indexstruktur. Stattdessen erstellt das Volltextmodul für SQL Server Zwischenindizes, wenn Daten indiziert werden. Anschließend werden diese Indizes von der Volltextsuch-Engine bei Bedarf in einen größeren Index zusammengeführt. Dieser Vorgang kann mehrfach wiederholt werden. Die Volltextsuch-Engine führt einen "Mastermergeprozess" aus, bei dem alle Zwischenindizes zu einem größeren Masterindex kombiniert werden.

Auf jeder Zwischenstufe werden Statistiken erhoben. Die Statistiken werden beim Zusammenführen der Indizes zusammengeführt. Einige statistische Werte können nur während des Mastermergeprozesses generiert werden.

Während SQL Server ein Abfrageergebnissatz bewertet, verwendet es Statistiken aus dem größten Zwischenindex. Dies hängt davon ab, ob Zwischenindizes zusammengeführt werden oder nicht. Daher kann die Rangfolgenstatistik in der Genauigkeit variieren, wenn die Zwischenindizes nicht zusammengeführt werden. Dies erklärt, warum dieselbe Abfrage zu verschiedenen Zeitpunkten unterschiedliche Rangergebnisse zurückgeben kann, wenn volltextindizierte Daten hinzugefügt, geändert und gelöscht werden und wenn die kleineren Indizes zusammengeführt werden.

Häufig werden die Statistiken gerundet, um die Größe des Indexes und die Komplexität der Berechnung zu minimieren.

Die folgende Liste enthält einige häufig verwendete Begriffe und statistische Werte, die bei der Berechnung der Rangfolge wichtig sind.

Ausdruck /Wert Beschreibung
Eigenschaft Eine volltextindizierte Spalte der Zeile.
Document Die Entität, die in Abfragen zurückgegeben wird. In SQL Server entspricht dies einer Zeile. Ein Dokument kann mehrere Eigenschaften aufweisen, ebenso wie eine Zeile mehrere volltextindizierte Spalten aufweisen kann.
Index Ein einzelner invertierter Index mindestens eines Dokuments. Dies kann sich vollständig im Arbeitsspeicher oder auf dem Datenträger befinden. Viele Abfragestatistiken sind relativ zu dem jeweiligen Index, mit dem der Vergleich ausgeführt wurde.
Volltextkatalog Eine Auflistung von Zwischenindizes, die für Abfragen als eine Entität behandelt wird. Kataloge sind die Organisationseinheit, die für den SQL Server-Administrator sichtbar ist.
Word, Token oder Element Die Vergleichseinheit in der Volltext-Engine. Textströme aus Dokumenten werden durch eine sprachspezifische Wörtertrennung in Wörter oder Token zerlegt.
Vorkommen Der von der Wörtererkennung bestimmte Offset eines Worts in einer Dokumenteigenschaft. Das erste Wort stellt Vorkommen 1 dar, das nächste 2 usw. Um falsche Treffer in Ausdrucks- und NEAR-Abfragen zu vermeiden, bewirken Satzende- und Absatzendezeichen größere Abstände zwischen den Vorkommen.
TermFrequency Die Anzahl der Vorkommen des Schlüsselwerts in einer Zeile.
IndexedRowCount Gesamtanzahl der indizierten Zeilen. Diese wird aus den in den Zwischenindizes geführten Zählern berechnet. Die Genauigkeit der Anzahl kann variieren.
KeyRowCount Gesamtanzahl der Zeilen im Volltextkatalog, die einen bestimmten Schlüssel enthalten.
MaxOccurrence Das größte in einem Volltextkatalog gespeicherte Vorkommen für eine bestimmte Eigenschaft in einer Zeile.
MaxQueryRank Der maximale Rang, 1000, der von der Volltextsuch-Engine zurückgegeben wird.

Bewertungsberechnungsprobleme

Der Prozess der Berechnungsbewertung hängt von vielen Faktoren ab. Die Wörtererkennung für unterschiedliche Sprachen zerlegt Text unterschiedlich in Wörter. So könnte z. B. die Zeichenfolge "dog-house" von einer Wörtererkennung in "dog" "house" und von einer anderen in "dog-house" zerlegt werden. Dies bedeutet, dass der Abgleich und die Rangfolge je nach der angegebenen Sprache variieren, da nicht nur die Wörter unterschiedlich sind, sondern auch die Dokumentlänge. Die unterschiedliche Dokumentlänge kann sich auf die Rangfolgenberechnung für alle Abfragen auswirken.

Statistiken wie IndexRowCount können stark variieren. Hat z. B. ein Katalog 2 Milliarden Zeilen im Masterindex, wird ein einzelnes neues Dokument in einen im Arbeitsspeicher befindlichen Zwischenindex indiziert, und die Ränge für das Dokument, die auf der Anzahl der Dokumente im Index im Arbeitsspeicher basieren, können im Vergleich zu den Rängen für Dokumente aus dem Masterindex verfälscht sein. Aus diesem Grund wird empfohlen, dass Sie nach einer Grundgesamtheit, die zu einer großen Anzahl von Zeilen führt, die indiziert oder neu indiziert werden, die Indizes in einem Masterindex mithilfe der ALTER FULLTEXT CATALOG ... REORGANIZE Transact-SQL-Anweisung zusammenführen. Das Volltextmodul führt die Indizes auch automatisch basierend auf Parametern wie anzahl und Größe von Zwischenindizes zusammen.

MaxOccurrence -Werte werden in den Bereich 1 bis 32 normalisiert. Dies bedeutet beispielsweise, dass ein Dokument mit 50 Wörtern gleich behandelt wird wie ein Dokument mit 100 Wörtern. Es folgt die Tabelle, die für die Normalisierung verwendet wird. Da sich die Dokumentlängen im Bereich zwischen angrenzenden Tabellenwerten 32 und 128 befinden, werden sie effektiv mit derselben Länge behandelt, 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 der CONTAINSTABLE

Beim Generieren der Rangfolge fürCONTAINSTABLE wird der folgende Algorithmus verwendet:

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

Der Rang von Übereinstimmungen in Ausdrücken wird genauso bestimmt wie einzelne Schlüssel, außer dass KeyRowCount (die Anzahl von Zeilen, die den Ausdruck enthalten) geschätzt wird und somit ungenau und höher als die tatsächliche Anzahl ausfallen kann.

Rang von NEAR

CONTAINSTABLE unterstützt das Abfragen von zwei oder mehr Suchbegriffen in näherer Nähe zueinander mithilfe der NEAR Option. Der Rangwert der einzelnen zurückgegebenen Zeilen basiert auf mehreren Parametern. Ein Hauptrangfaktor ist die Gesamtzahl der Übereinstimmungen (oder Treffer) in Bezug auf die Länge des Dokuments. Wenn beispielsweise ein Dokument mit 100 Wörtern und ein Dokument mit 900 Wörtern identische Übereinstimmungen enthalten, wird dem Dokument mit 100 Wörtern ein höherer Rangwert zugewiesen.

Die Gesamtlänge der einzelnen Treffer in einer Zeile trägt auch zur Rangfolge dieser Zeile bei, basierend auf dem Abstand zwischen den ersten und letzten Suchbegriffen dieses Treffers. Je kleiner die Entfernung, desto relevanter ist der Treffer für den Rangwert der Zeile. Wenn eine Volltextabfrage keine ganze Zahl als maximaler Abstand angibt, weist ein Dokument, das nur Treffer enthält, deren Entfernungen größer als 100 logische Ausdrücke sind, eine Rangfolge von 0 auf.

Rang des ISABOUT

CONTAINSTABLE unterstützt die Abfrage nach gewichteten Ausdrücken mithilfe der ISABOUT Option. ISABOUT ist eine Vektorraumabfrage in herkömmlicher Terminologie zum Abrufen von Informationen. Der verwendete Standardalgorithmus zur Rangfolgenberechnung ist Jaccard, eine bekannte Formel. Die Rangfolge wird für jeden Ausdruck in der Abfrage berechnet und dann kombiniert, wie im folgenden Algorithmus beschrieben.

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

Rang der FREETEXTTABLE

Die Rangfolgenberechnung fürFREETEXTTABLE basiert auf der OKAPI BM25-Rangfolgenformel. FREETEXTTABLE Abfragen fügen der Abfrage Wörter über die inflectionale Generierung hinzu (inflected forms of the original query words); Diese Wörter werden als separate Wörter behandelt, ohne dass sie eine besondere Beziehung zu den Wörtern haben, aus denen sie generiert wurden. Aus der Thesaurus-Funktion generierte Synonyme werden als separate, gleich gewichtete Begriffe behandelt. Jedes Wort in der Abfrage wird bei der Rangberechnung einbezogen.

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.