Índice de texto completo en una columna XML

Puede crear un índice de texto en columnas XML para indizar el contenido de los valores XML, pero omitiendo el marcado XML. Los valores de los atributos se incluyen en el índice de texto a menos que sean valores numéricos. Las etiquetas de elemento se utilizan como límites de token. Si es posible, puede combinar una búsqueda de texto con un índice XML como se indica a continuación:

  1. En primer lugar, filtre los valores XML que resulten de interés mediante una búsqueda de texto SQL.

  2. A continuación, realice una consulta en los valores XML que usen índice XML en la columna XML.

Ejemplo: combinar una búsqueda de texto con consultas XML

Una vez creado un índice de texto en la columna XML, la siguiente consulta comprueba que un valor XML contiene la palabra "custom" en el título de un libro:

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

El método contains() utiliza el índice de texto para crear un subconjunto con los valores XML que contienen la palabra "custom" en algún lugar del documento. La cláusula exist() se asegura de que la palabra "custom" aparezca en el título de un libro.

Una búsqueda de texto que usa contains() y la función contains() de XQuery tiene semánticas distintas. La última busca una coincidencia de subcadena y la primera busca una coincidencia de testigo que utilice lematización. Es decir, si se busca la cadena que contiene "run" en el título, las coincidencias incluirán "run", "runs" y "running", puesto que se cumplen los criterios tanto de contains() de texto como los de la función contains() de XQuery. Sin embargo, la consulta no coincide con la palabra "customizable" del título, ya que la función contains() para la búsqueda de texto genera un error, pero la función contains() de Xquery sí se cumple. Por lo general, para una coincidencia de subcadena pura, debe quitarse la cláusula contains() de la búsqueda de texto.

Además, la búsqueda de texto usa lematización de palabras, pero la función contains() de XQuery busca una coincidencia literal. Esta diferencia se describe en el siguiente ejemplo.

Ejemplo: búsqueda de texto en valores XML mediante lematización

Por lo general, la comprobación de la función contains() de XQuery que se efectuó en el ejemplo anterior no se puede eliminar. Considere esta consulta:

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

La palabra "ran" en el documento cumple la condición de búsqueda debido a la lematización. Además, el contexto de búsqueda no se comprueba mediante XQuery.

Cuando el XML se descompone en columnas relacionales utilizando AXSD y las columnas se incluyen en el índice de texto, las consultas XPath que se ejecutan en la vista XML no efectúan búsquedas de texto en las tablas subyacentes.