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 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 zu unterzuordnen, die das Wort "custom" an einer beliebigen Stelle im Dokument enthalten. Die exist() Klausel stellt sicher, dass das Wort "benutzerdefiniert" im Titel eines Buchs auftritt.

Eine Volltextsuche, die verwendet contains() wird, und XQuery contains() verfügt über unterschiedliche Semantik. Das Letztere ist eine Teilzeichenfolgenübereinstimmung, und das Erstere ist eine Tokenübereinstimmung mithilfe der Wortformgenerierung. Wenn die Suche daher für die Zeichenfolge mit "run" im Titel gilt, enthalten die Übereinstimmungen "run", "runs" und "running", da sowohl der Volltext contains() als auch die XQuery contains() zufrieden sind. Die Abfrage stimmt jedoch nicht mit dem Wort "anpassbar" im Titel überein, in dem der Volltext contains() fehlschlägt, aber die XQuery contains() ist zufrieden. Im Allgemeinen sollte für eine reine Teilzeichenfolgenüberstimmung die Volltextklausel contains() entfernt werden.

Darüber hinaus verwendet die Volltextsuche Wortstammerkennung, aber XQuery contains() ist eine Literal-Übereinstimmung. Dieser Unterschied wird im folgenden Beispiel veranschaulicht.

Beispiel: Volltextsuche für XML-Werte mit Wortstammerkennung

Die XQuery-Überprüfung contains() , die im vorherigen Beispiel ausgeführt wurde, kann in der Regel nicht entfernt werden. Angenommen, die folgende Abfrage wird ausgeführt:

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

Das Wort "ran" im Dokument stimmt wegen der Verwendung der Wortformgenerierung mit der Suchbedingung überein. Darüber hinaus wird der Suchkontext nicht mithilfe von XQuery überprüft.

Wenn XML in relationale Spalten mithilfe von AXSD kompiliert wird, die volltextindiziert sind, führen XPath-Abfragen, die über die XML-Ansicht auftreten, keine Volltextsuche für die zugrunde liegenden Tabellen durch.

Siehe auch