Usare la ricerca full-text con colonne XML

Si applica a:SQL ServerDatabase SQL diAzure Istanza gestita di SQL di Azure

Sulle colonne XML è possibile creare un indice full-text che indicizza il contenuto dei valori XML, ma ignora i markup XML. I tag degli elementi vengono utilizzati come limiti dei token. Gli elementi riportati di seguito sono indicizzati:

  • Contenuto degli elementi XML.

  • Solo il contenuto degli attributi XML dell'elemento di livello principale, a meno che non si tratti di valori numerici.

In alcuni casi è possibile combinare la ricerca full-text con l'indicizzazione XML, procedendo nel modo descritto di seguito.

  1. Filtrare innanzitutto i valori XML desiderati utilizzando la ricerca full-text SQL.

  2. Eseguire quindi una query sui valori XML che utilizzano l'indice XML sulla colonna XML.

Esempio: Combinare la ricerca full-text con query XML

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:

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

Il contains() metodo utilizza l'indice full-text per subsetre i valori XML che contengono la parola "custom" ovunque nel documento. La exist() clausola garantisce che la parola "personalizzata" si verifichi nel titolo di un libro.

Una ricerca full-text che usa contains() e XQuery contains() ha una semantica diversa. Nel secondo caso si tratta di una corrispondenza tra sottostringhe, mentre nel primo si tratta di una corrispondenza tra token basata sullo stemming. Pertanto, se la ricerca è per la stringa che ha "run" nel titolo, le corrispondenze includeranno "run", "runs" e "running", perché sia il full-text contains() che XQuery contains() sono soddisfatti. Tuttavia, la query non corrisponde alla parola "personalizzabile" nel titolo in quanto il testo full-text contains() ha esito negativo, ma XQuery contains() è soddisfatto. In genere, per la corrispondenza di sottostringa pura, la clausola full-text contains() deve essere rimossa.

Inoltre, la ricerca full-text usa lo stemming delle parole, ma XQuery contains() è una corrispondenza letterale. Tale differenza è illustrata nell'esempio successivo.

Esempio: ricerca full-text su valori XML tramite stemming

Il controllo XQuery contains() eseguito nell'esempio precedente in genere non può essere eliminato. Considerare la query seguente:

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

La parola "ran" nel documento soddisfa la condizione di ricerca a causa dello stemming. Inoltre, il contesto di ricerca non viene controllato tramite XQuery.

Quando XML viene scomposto in colonne relazionali tramite AXSD indicizzate full-text, le query XPath eseguite sulla vista XML non eseguono ricerche full-text sulle tabelle sottostanti.

Vedi anche