Utiliser la recherche en texte intégral avec des colonnes XML

S’applique à :SQL ServerAzure SQL DatabaseAzure 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 :

  1. Tout d'abord, filtrez les valeurs XML pertinentes à l'aide d'une recherche en texte intégral SQL.

  2. Ensuite, interrogez les valeurs XML pour lesquelles il existe un index XML sur la colonne XML.

Exemple : Combiner la recherche en texte intégral avec l’interrogation 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 contains() méthode utilise l’index de recherche en texte intégral pour sous-ensemble des valeurs XML qui contiennent le mot « personnalisé » n’importe où dans le document. La exist() clause garantit que le mot « personnalisé » se produit dans le titre d’un livre.

Une recherche en texte intégral qui utilise contains() et XQuery contains() a une sémantique différente. 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 concerne la chaîne qui a « run » dans le titre, les correspondances incluent « run », « run » et « running », car le texte contains() intégral et le XQuery contains() sont satisfaits. Toutefois, la requête ne correspond pas au mot « personnalisable » dans le titre dans lequel le texte contains() intégral échoue, mais le XQuery contains() est satisfait. En règle générale, pour une correspondance de sous-chaîne pure, la clause de texte contains() intégral doit être supprimée.

En outre, la recherche en texte intégral utilise la recherche de mots, mais XQuery contains() est une correspondance littérale. Cette différence est expliquée dans l'exemple suivant.

Exemple : recherche en texte intégral sur des valeurs XML à l’aide de la recherche de recherche en texte intégral à l’aide de la recherche de recherche en texte intégral

La vérification XQuery contains() effectuée dans l’exemple précédent ne peut généralement pas être supprimé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. En outre, le contexte de recherche n’est pas vérifié à l’aide de XQuery.

Lorsque XML est décomposé en colonnes relationnelles à l’aide d’AXSD indexés en texte intégral, les requêtes XPath qui se produisent sur la vue XML n’effectuent pas de recherche en texte intégral sur les tables sous-jacentes.

Voir aussi