Sdílet prostřednictvím


Použití fulltextového vyhledávání se sloupci XML

platí pro:SQL ServerAzure SQL Databaseazure SQL Managed Instance

Pro sloupce XML můžete vytvořit fulltextový index, který indexuje obsah hodnot XML, ale ignoruje kód XML. Značky elementů se používají jako hranice tokenů. Indexují se následující položky:

  • Obsah elementů XML.

  • Obsah atributů XML elementu nejvyšší úrovně pouze, pokud tyto hodnoty nejsou číselné hodnoty.

Pokud je to možné, můžete fulltextové vyhledávání kombinovat s indexem XML následujícím způsobem:

  1. Nejprve vyfiltrujte hodnoty XML, které zajímají, pomocí fulltextového vyhledávání SQL.

  2. Dále zadejte dotaz na hodnoty XML, které ve sloupci XML používají index XML.

Příklad: Kombinování fulltextového vyhledávání s dotazováním XML

Po vytvoření fulltextového indexu ve sloupci XML následující dotaz zkontroluje, že hodnota XML obsahuje slovo "vlastní" v názvu knihy:

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

Metoda contains() používá fulltextový index pro vytvoření podmnožiny hodnot XML obsahujících slovo "vlastní" kdekoli v dokumentu. Klauzule exist() zajišťuje, že slovo "custom" se vyskytuje v názvu knihy.

Fulltextové vyhledávání, které používá contains() a contains() XQuery, má jinou sémantiku. Posledně jmenované je shoda podřetězce a první jmenované je shoda tokenu, která používá stemming. Při hledání řetězce, který má v názvu "run", budou shody zahrnovat "run", "runs" a "running", protože jsou splněné podmínky jak pro fulltextové vyhledávání contains(), tak pro XQuery contains(). Dotaz ale neodpovídá slovu "přizpůsobitelný" v názvu v tom, že fulltextová contains() selže, ale contains() XQuery je splněná. Obecně platí, že pro čistou shodu podřetězce by měla být odstraněna klauzule fulltext contains().

Navíc fulltextové vyhledávání používá stemming slov, ale XQuery contains() je doslovná shoda. Tento rozdíl je znázorněn v dalším příkladu.

Příklad: Fulltextové vyhledávání hodnot XML pomocí stemmingu

Kontrola contains() XQuery provedená v předchozím příkladu obecně nejde odstranit. Zvažte tento dotaz:

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

Slovo "běžet" v dokumentu odpovídá hledané podmínce kvůli zamykání. Kontext vyhledávání se navíc nekontroluje pomocí XQuery.

Když je XML rozložen do relačních sloupců pomocí AXSD, které jsou indexovány fulltextem, XPath dotazy, ke kterým dochází v zobrazení XML, neprovádějí fulltextové vyhledávání v podkladových tabulkách.

Viz také