Verwenden der Volltextsuche mit XML-Spalten

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

Sie können einen Volltextindex für XML-Spalten erstellen, bei dem der Inhalt der XML-Werte indiziert, das XML-Markup jedoch ignoriert wird. Elementtags werden als Tokenbegrenzungen verwendet. Folgende Elemente werden indiziert:

  • Der Inhalt von XML-Elementen.

  • Nur der Inhalt von XML-Attributen des Elements der obersten Ebene, außer wenn diese Werte numerische Werte sind.

Gegebenenfalls können Sie die Volltextsuche mit dem XML-Index auf folgende Weise kombinieren:

  1. Filtern Sie zuerst die XML-Werte von Interesse mithilfe der SQL-Volltextsuche.

  2. Fragen Sie als Nächstes solche XML-Werte ab, die den XML-Index für die XML-Spalte verwenden.

Beispiel: Kombinieren der Volltextsuche mit einer XML-Abfrage

Nachdem der Volltextindex für die XML-Spalte erstellt wurde, überprüft die folgende Abfrage, ob ein XML-Wert das Wort "custom" im Titel eines Buchs enthält:

SELECT *
FROM   T
WHERE  CONTAINS(xCol,'custom')
AND    xCol.exist('/book/title/text()[contains(.,"custom")]') = 1;

Die contains()-Methode verwendet den Volltextindex, um die XML-Werte, die das Wort „custom“ irgendwo im Dokument enthalten, zu einer Teilmenge zusammenzufassen. Die exist()-Klausel stellt sicher, dass das Wort „custom“ im Titel eines Buchs vorkommt.

Eine Volltextsuche mit der contains()-Klausel und XQuery mithilfe der contains()-Klausel weisen unterschiedliche Semantiken auf. Letzteres ist eine Teilstringübereinstimmung, und Ersteres ist eine Tokenübereinstimmung, die Stemming verwendet. Daher umfassen die Übereinstimmungen, wenn nach der Zeichenfolge gesucht wird, die im Titel „run“ enthält, „run“, „runs“ und „running“, weil sowohl die Volltextklausel contains() als auch die XQuery-Klausel contains() erfüllt sind. Allerdings entspricht die Abfrage nicht dem Wort „customizable“ im Titel, weil die Volltextsuche contains() fehlschlägt, die XQuery-Klausel contains() jedoch erfüllt ist. Im Allgemeinen sollte für eine reine Teilzeichenfolgenübereinstimmung die Volltextklausel contains() entfernt werden.

Außerdem verwendet die Volltextsuche die Wortstammerkennung, während XQuery contains() eine exakte Zeichenfolgenübereinstimmung ist. Dieser Unterschied wird im folgenden Beispiel veranschaulicht.

Beispiel: Volltextsuche in XML-Werten mit Stemming

Die XQuery contains()-Überprüfung, die im vorherigen Beispiel durchgeführt wurde, kann im Allgemeinen nicht eliminiert werden. Betrachten Sie die folgende Abfrage:

SELECT *
FROM   T
WHERE  CONTAINS(xCol,'run');

Das Wort "ran" im Dokument entspricht aufgrund von Stemming der Suchbedingung. Außerdem wird der Suchkontext nicht mithilfe von XQuery überprüft.

Wenn XML in relationale Spalten zerlegt wird, indem volltextindizierte AXSD verwendet wird, führen XPath-Abfragen, die für die XML-Sicht ausgeführt werden, keine Volltextsuche der zugrunde liegenden Tabellen durch.