Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à :SQL Server
Azure SQL Database
Azure SQL Managed Instance
Vous pouvez créer un index de texte intégral sur des colonnes XML de façon à indexer le contenu des valeurs XML tout en ignorant le balisage XML. Des balises d'éléments sont utilisées comme limites de jeton. Les éléments suivants sont indexés :
Contenu des éléments XML.
Contenu des attributs XML de l'élément de premier niveau uniquement, à moins qu'il ne s'agisse de valeurs numériques.
Lorsque cela est possible, vous pouvez associer une recherche en texte intégral et un index XML. Pour cela, procédez comme suit :
Tout d'abord, filtrez les valeurs XML pertinentes à l'aide d'une recherche en texte intégral SQL.
Ensuite, interrogez les valeurs XML pour lesquelles il existe un index XML sur la colonne XML.
Exemple : association d'une recherche en texte intégral avec une requête XML
Une fois l'index de texte intégral créé sur la colonne XML, la requête suivante recherche une valeur XML contenant le mot « custom » dans le titre d'un livre :
SELECT *
FROM T
WHERE CONTAINS(xCol,'custom')
AND xCol.exist('/book/title/text()[contains(.,"custom")]') = 1;
La méthode contains() utilise l’index de texte intégral pour créer un sous-ensemble de valeurs XML contenant le mot « custom » à un endroit quelconque du document. La clause exist() vérifie que le mot « custom » apparaît dans le titre d’un livre.
Une recherche en texte intégral qui utilise contains() et la fonction XQuery contains() ont des sémantiques différentes. La dernière cherche à établir une concordance de sous-chaîne tandis que la première fait appel à la correspondance de mot clé avec extraction de radical. Par conséquent, si la recherche porte sur la chaîne contenant « run » dans le titre, les correspondances incluent « run », « runs » et « running », car à la fois le contains() de texte intégral et le contains() XQuery sont satisfaits. Toutefois, la requête ne correspond pas au mot « customizable » dans le titre, car le contains() de texte intégral échoue alors que le contains() XQuery est satisfait. En général, pour une correspondance de sous-chaîne pure, la clause de texte intégral contains() doit être supprimée.
En outre, la recherche en texte intégral utilise la racinisation des mots, tandis que le contains() XQuery effectue une correspondance littérale. Cette différence est expliquée dans l'exemple suivant.
Exemple : recherche en texte intégral sur des valeurs XML avec racinisation
La vérification XQuery contains() exécutée dans l’exemple précédent ne peut généralement pas être éliminée. Prenons par exemple la requête suivante :
SELECT *
FROM T
WHERE CONTAINS(xCol,'run');
Le mot « ran » du document correspond aux critères de recherche du fait de l'extraction de radical. De plus, le contexte de recherche n'est pas vérifié à l'aide de XQuery.
Lorsque le code XML est décomposé, à l'aide de AXSD, dans des colonnes relationnelles indexées en texte intégral, les requêtes XPath qui portent sur la vue XML ne lancent pas une recherche en texte intégral sur les tables sous-jacentes.