Utilizzo della ricerca full-text con colonne XMLUse Full-Text Search with XML Columns

Sulle colonne XML è possibile creare un indice full-text che indicizza il contenuto dei valori XML, ma ignora i markup XML.You can create a full-text index on XML columns that indexes the content of the XML values, but ignores the XML markup. I tag degli elementi vengono utilizzati come limiti dei token.Element tags are used as token boundaries. Gli elementi riportati di seguito sono indicizzati:The following items are indexed:

  • Contenuto degli elementi XML.The content of XML elements.

  • Solo il contenuto degli attributi XML dell'elemento di livello principale, a meno che non si tratti di valori numerici.The content of XML attributes of the top-level element only, unless those values are numeric values.

    In alcuni casi è possibile combinare la ricerca full-text con l'indicizzazione XML, procedendo nel modo descritto di seguito.When possible, you can combine full-text search with XML index in the following way:

  1. Filtrare innanzitutto i valori XML desiderati utilizzando la ricerca full-text SQL.First, filter the XML values of interest by using SQL full-text search.

  2. Eseguire quindi una query sui valori XML che utilizzano l'indice XML sulla colonna XML.Next, query those XML values that use XML index on the XML column.

Esempio: combinazione di ricerca full-text e query XMLExample: Combining Full-text Search with XML Querying

Dopo la creazione dell'indice full-text sulla colonna XML è possibile utilizzare la query seguente per verificare se un valore XML contiene la parola "custom" nel titolo di 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  

Il metodo contains() usa l'indice full-text per creare un subset dei valori XML contenenti la parola "custom", in qualunque punto 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 clausola exist() garantisce che la parola "custom" compaia nel titolo di un libro.The exist() clause ensures that the word "custom" occurs in the title of a book.

Una ricerca full-text che usa contains() a la query XQuery contains() hanno semantiche diverse.A full-text search that uses contains() and XQuery contains() has different semantics. Nel secondo caso si tratta di una corrispondenza tra sottostringhe, mentre nel primo si tratta di una corrispondenza tra token basata sullo stemming.The latter is a substring match and the former is a token match that uses stemming. Quindi, se si esegua la ricerca della stringa che include la parola "run" nel titolo, le corrispondenze includeranno le parole "run", "runs" e "running", perché sono soddisfatti sia i criteri della ricerca full-text contains() che quelli della query XQuery contains() .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. La query, tuttavia, non individua la parola "customizable" nel titolo, perché la ricerca full-text contains() non riesce, ma la query XQuery contains() è soddisfatta.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. In genere, per le semplici corrispondenze di sottostringhe è consigliabile rimuovere la clausola contains() della ricerca full-text.Generally, for pure substring match, the full-text contains() clause should be removed.

Inoltre, la ricerca full-text usa lo stemming delle parole, mentre la query XQuery contains() richiede una corrispondenza letterale.Additionally, full-text search uses word stemming, but XQuery contains() is a literal match. Tale differenza è illustrata nell'esempio successivo.This difference is illustrated in the next example.

Esempio: ricerca full-text su valori XML tramite stemmingExample: Full-text Search on XML Values Using Stemming

Il controllo eseguito dalla query XQuery contains() nell'esempio precedente non può essere in genere eliminato.The XQuery contains() check that was performed in the previous example generally cannot be eliminated. Considerare la query seguente:Consider this query:

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

La parola "ran" nel documento soddisfa la condizione di ricerca a causa dello stemming.The word "ran" in the document matches the search condition because of stemming. Se si utilizza una query XQuery, inoltre, il contesto della ricerca non viene verificato.Additionally, the search context is not checked by using XQuery.

Quando i valori XML vengono scomposti tramite AXSD in colonne relazionali con indicizzazione full-text, le query XPath sulla visualizzazione XML non eseguono una ricerca full-text sulle tabelle sottostanti.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.

Vedere ancheSee Also

Indici XML (SQL Server)XML Indexes (SQL Server)