Usar la búsqueda de texto completo con columnas XMLUse Full-Text Search with XML Columns

ESTE TEMA SE APLICA A:síSQL Server (a partir de 2008)noAzure SQL DatabasenoAzure SQL Data Warehouse noAlmacenamiento de datos paralelos THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Puede crear un índice de texto completo en columnas XML para indizar el contenido de los valores XML, pero omitiendo el marcado XML.You can create a full-text index on XML columns that indexes the content of the XML values, but ignores the XML markup. Las etiquetas de elemento se usan como límites de token.Element tags are used as token boundaries. Los siguientes elementos se indizan:The following items are indexed:

  • Contenido de los elementos XML.The content of XML elements.

  • Contenido de los atributos XML del elemento de nivel superior únicamente, a menos que esos valores sean numéricos.The content of XML attributes of the top-level element only, unless those values are numeric values.

    Si es posible, puede combinar una búsqueda de texto completo con un índice XML como se indica a continuación:When possible, you can combine full-text search with XML index in the following way:

  1. En primer lugar, filtre los valores XML que resulten de interés mediante una búsqueda de texto completo SQL.First, filter the XML values of interest by using SQL full-text search.

  2. A continuación, realice una consulta en los valores XML que usen índice XML en la columna XML.Next, query those XML values that use XML index on the XML column.

Ejemplo: combinar una búsqueda de texto completo con consultas XMLExample: Combining Full-text Search with XML Querying

Una vez creado un índice de texto completo en la columna XML, la siguiente consulta comprueba que un valor XML contiene la palabra "custom" en el título de un libro:After the full-text index has been created on the XML column, the following query checks that an XML value contains the word "custom" in the title of a book:

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

El método contains() usa el índice de texto completo para crear un subconjunto con los valores XML que contienen la palabra "custom" en algún lugar del documento.The contains() method uses the full-text index to subset the XML values that contain the word "custom" anywhere in the document. La cláusula exist() se asegura de que la palabra "custom" aparezca en el título de un libro.The exist() clause ensures that the word "custom" occurs in the title of a book.

Una búsqueda de texto completo que usa contains() y la función contains() de XQuery tiene semánticas distintas.A full-text search that uses contains() and XQuery contains() has different semantics. La última busca una coincidencia de subcadena y la primera busca una coincidencia de token que utilice lematización.The latter is a substring match and the former is a token match that uses stemming. 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 completo como los de la función contains() de XQuery.Therefore, if the search is for the string that has "run" in the title, the matches will include "run", "runs", and "running", because both the full-text contains() and the Xquery contains() are satisfied. Pero la consulta no coincide con la palabra "customizable" del título, ya que la función contains() para la búsqueda de texto completo genera un error, pero la función contains() de Xquery sí se cumple.However, the query does not match the word "customizable" in the title in that the full-text contains() fails, but the Xquery contains() is satisfied. Por lo general, para una coincidencia de subcadena pura, debe quitarse la cláusula contains() de la búsqueda de texto completo.Generally, for pure substring match, the full-text contains() clause should be removed.

Además, la búsqueda de texto completo usa lematización de palabras, pero la función contains() de XQuery busca una coincidencia literal.Additionally, full-text search uses word stemming, but XQuery contains() is a literal match. Esta diferencia se describe en el siguiente ejemplo.This difference is illustrated in the next example.

Ejemplo: búsqueda de texto completo en valores XML mediante lematizaciónExample: Full-text Search on XML Values Using Stemming

Por lo general, la comprobación de la función contains() de XQuery que se ha efectuado en el ejemplo anterior no se puede eliminar.The XQuery contains() check that was performed in the previous example generally cannot be eliminated. Considere esta consulta:Consider this query:

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.The word "ran" in the document matches the search condition because of stemming. Además, el contexto de búsqueda no se comprueba mediante XQuery.Additionally, the search context is not checked by using XQuery.

Cuando el XML se descompone en columnas relacionales utilizando AXSD y las columnas se incluyen en el índice de texto completo, las consultas XPath que se ejecutan en la vista XML no efectúan búsquedas de texto completo en las tablas subyacentes.When XML is decomposed into relational columns by using AXSD that are full-text indexed, XPath queries that occur over the XML view do not perform full-text search on the underlying tables.

Ver tambiénSee Also

Índices XML (SQL Server)XML Indexes (SQL Server)