Einschränken von Suchergebnissen mit RANK

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

Die Funktionen CONTAINSTABLE und FREETEXTTABLE geben eine Spalte zurück RANK , die Ordinalwerte von 0 bis 1.000 (Rangwerte) enthält. Diese Werte ordnen die Zeilen danach, wie gut sie den Auswahlkriterien entsprechen. 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 unwichtig und unterscheiden sich typischerweise jedes Mal, wenn die Abfrage ausgeführt wird.

Hinweis

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

Die Anzahl der Elemente, die eine Suchbedingung erfüllen, ist oft groß. Um zu verhindern, dass CONTAINSTABLE oder FREETEXTTABLE Abfragen zu viele Übereinstimmungen zurückgeben, verwenden Sie den optionalen Parameter top_n_by_rank. Es wird nur eine Teilmenge der Zeilen zurückgegeben. top_n_by_rank ist ein Integer-Wert ( n) mit dem festgelegt wird, dass nur die n höchsten Übereinstimmungen in absteigender Reihenfolge zurückgegeben werden. 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.

Die SQL Server Datenbank-Engine ordnet die Übereinstimmungen nach Rang und gibt nur die angegebene Anzahl Zeilen zurück. Zum Beispiel wird eine Abfrage, die normalerweise 100.000 Zeilen aus einer Tabelle mit 1.000.000 Zeilen zurückgibt, schneller verarbeitet, wenn nur die obersten 100 Zeilen angefordert werden.

Beispiele für die Verwendung von RANK zur Begrenzung von Suchergebnissen

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

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

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 ist die Ergebnisliste aktiviert.

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 ausschließlich den obersten fünf Übereinstimmungen

Das folgende Beispiel verwendet CONTAINSTABLE, um die Beschreibung der fünf wichtigsten Produkte zurückzugeben, bei denen die Spalte Description das Wort "Aluminium" in der Nähe des Wortes light oder des Wortes lightweight enthält.

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

Wie Suchergebnisse eingestuft werden

Die Volltextsuche kann einen optionalen Wert (oder Rangwert) erzeugen, der die Relevanz der durch eine Volltextabfrage zurückgegebenen Daten angibt. Dieser Rangwert wird für jede Zeile berechnet und kann als Ordnungskriterium verwendet werden, um die Ergebnismenge einer gegebenen 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 hat keinerlei abfrageüberschreitende Bedeutung.

Statistiken für die Rangfolge

Wenn man einen Index erstellt, sammelt das System Statistiken, die in der Rangfolge verwendet werden. Das Erstellen eines Volltextkatalogs erzeugt nicht direkt eine einheitliche Indexstruktur. Stattdessen erstellt die Full-Text Engine Zwischenindizes, während sie Daten indexiert. Anschließend werden diese Indizes von der Volltextsuch-Engine bei Bedarf in einen größeren Index zusammengeführt. Dieser Prozess kann viele Male passieren. Die Volltextsuch-Engine führt einen "Mastermergeprozess" aus, bei dem alle Zwischenindizes zu einem größeren Masterindex kombiniert werden.

Statistiken werden auf jeder Zwischenindexebene erhoben. Die Statistiken werden zusammengeführt, wenn die Indizes zusammengelegt werden. Einige statistische Werte können nur während des Mastermergeprozesses generiert werden.

Während die Datenbank-Engine eine Abfrageergebnismenge rangiert, verwendet sie Statistiken aus dem größten Zwischenindex. Diese Verwendung hängt davon ab, ob Zwischenindizes zusammengeführt werden. Demzufolge kann die Rangfolgestatistik unterschiedlich genau ausfallen, wenn die Zwischenindizes nicht zusammengeführt werden. Dieser Unterschied in der Genauigkeit erklärt, warum dieselbe Abfrage im Laufe der Zeit unterschiedliche Rang-Ergebnisse liefern kann, wenn Volltext-indexierte Daten hinzugefügt, verändert und gelöscht werden und kleinere 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 beim Berechnen des Rangs wichtig sind:

Begriff / Wert Beschreibung
Eigenschaft Eine volltextindizierte Spalte der Zeile
Document Die Entität, die in Abfragen zurückgegeben wird. In der Datenbank-Engine 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. Er 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 das, was Administratoren als Einheit der Organisation sehen.
Wort, Token oder Gegenstand Die Vergleichseinheit in der Volltext-Engine. Textströme aus Dokumenten werden durch sprachspezifische Wortbrecher in Wörter oder Token tokenisiert.
Vorkommen Der von der Wörtererkennung bestimmte Offset eines Worts in einer Dokumenteigenschaft Das erste Wort steht an Position 1, das nächste an Position 2 und so weiter. 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 Male, in denen der Schlüsselwert hintereinander auftritt.
IndexedRowCount Gesamtanzahl der indizierten Zeilen. Dieser Wert wird auf Basis der Zählungen in den Zwischenindizes 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 höchste Rang, 1000, wird von der Full-Text Engine zurückgegeben.

Probleme bei der Rangberechnung

Viele Faktoren beeinflussen den Prozess der Berechnung des Rangs. Worttrenner für verschiedene Sprachen tokenisieren Text unterschiedlich. Zum Beispiel teilt eine Wörtertrennungsfunktion die Zeichenkette „dog-house” in „dog” und „house” auf, während eine andere Wörtertrennungsfunktion sie als „dog-house” behandelt. Matching und Ranking variieren je nach angegebener Sprache, denn nicht nur die Wörter unterscheiden sich, 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. Wenn beispielsweise ein Katalog 2 Milliarden Zeilen im Masterindex hat, wird ein neues Dokument in einen In-Memory-Zwischenindex indexiert, und die Rangreihen dieses Dokuments basierend auf der Anzahl der Dokumente im Speicherindex könnten im Vergleich zu den Rangen für Dokumente aus dem Masterindex verzerrt werden. Aus diesem Grund führen Sie nach jeder Auffüllung, die zur Indizierung oder Neuindizierung einer großen Anzahl von Zeilen führt, die Indizes mithilfe der ALTER FULLTEXT CATALOG ... REORGANIZE Transact-SQL-Anweisung zu einem Masterindex zusammen. Entsprechend bestimmten Parametern, wie Anzahl und Größe der Zwischenindizes, werden die Indizes auch automatisch von der Volltextsuch-Engine zusammengeführt.

MaxOccurrence -Werte werden in den Bereich 1 bis 32 normalisiert. Diese Normalisierung bedeutet zum Beispiel, dass ein Dokument von 50 Wörtern genauso behandelt wird wie ein Dokument mit 100 Wörtern. Die folgende Tabelle zeigt die Normalisierung. Da die Dokumentlängen im Bereich zwischen den benachbarten Tabellenwerten 32 und 128 liegen, werden sie behandelt, als hätten sie dieselbe Länge, nämlich 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 von CONTAINSTABLE

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

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

Phrasenübereinstimmungen werden genauso bewertet wie einzelne Schlüssel, mit der Ausnahme, dass KeyRowCount (die Anzahl der Zeilen, die die Phrase enthalten) ein geschätzter Wert ist, der ungenau und höher als die tatsächliche Anzahl sein kann.

Rang von NEAR

CONTAINSTABLE unterstützt die Abfrage nach zwei oder mehr Suchbegriffen in räumlicher Nähe zueinander mithilfe der Option NEAR. 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 ebenfalls zum Rangwert der betreffenden Zeile bei, wobei die Entfernung zwischen dem ersten und dem letzten Suchbegriff des jeweiligen Treffers zugrunde gelegt wird. Je kleiner die Entfernung, desto relevanter ist der Treffer für den Rangwert der Zeile. Wenn eine Volltextabfrage keine ganze Zahl als maximale Distanz angibt, hat ein Dokument, das nur Treffer enthält, deren Abstände größer als 100 logische Begriffe voneinander entfernt sind, eine Rangfolge von 0.

Rang von ISABOUT

CONTAINSTABLE unterstützt das Abfragen von gewichteten Begriffen mit der ISABOUT-Option. ISABOUT ist eine Vektorraumabfrage in traditioneller Information Retrieval-Terminologie. Der verwendete Standardalgorithmus zur Rangfolgenberechnung ist Jaccard, eine bekannte Formel. Die Rangfolge wird für jeden Begriff in der Abfrage berechnet und dann, wie im folgenden Algorithmus beschrieben, kombiniert.

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 von FREETEXTTABLE

Die Rangfolgenberechnung fürFREETEXTTABLE basiert auf der OKAPI BM25-Rangfolgenformel. FREETEXTTABLE Abfragen fügen Wörter durch Flexionsgenerierung (flektierte Formen der ursprünglichen Suchwörter) zur Abfrage hinzu. Diese Wörter werden als eigenständige Wörter behandelt, ohne besondere Beziehung zu den Wörtern, aus denen sie stammen. 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.