Condividi tramite


Indice full-text su una colonna XML

Sulle colonne XML è possibile creare un indice full-text che indicizza il contenuto dei valori XML, ma ignora i markup XML. I valori Attribute sono indicizzati full-text a meno che non siano valori numerici. I tag elemento sono utilizzati come limiti del token. In alcuni casi è possibile combinare la ricerca full-text con l'indicizzazione XML, procedendo nel modo seguente:

  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: combinazione di ricerca full-text e 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 metodo contains() utilizza l'indice full-text per creare un subset dei valori XML contenenti la parola "custom", in qualunque punto del documento. La clausola exist() garantisce che la parola "custom" compaia nel titolo di un libro.

Una ricerca full-text che utilizza contains() e la query XQuery contains() hanno semantiche diverse. Nel secondo caso si tratta di una corrispondenza tra sottostringhe, mentre nel primo si tratta di una corrispondenza tra token basata sullo stemming. Se pertanto si ricerca la 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(). La query non individua tuttavia la parola "customizable" nel titolo, perché la ricerca full-text contains() non riesce, ma la query XQuery contains() è soddisfatta. In genere, per le semplici corrispondenze di sottostringhe è consigliabile rimuovere la clausola contains() della ricerca full-text.

La ricerca full-text utilizza inoltre lo stemming delle parole, mentre la query XQuery contains() richiede una corrispondenza letterale. Tale differenza è illustrata nell'esempio successivo.

Esempio: ricerca full-text su valori XML tramite stemming

Il controllo eseguito dalla query XQuery contains() nell'esempio precedente non può essere in genere 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. Se si utilizza una query XQuery, inoltre, il contesto della ricerca non viene verificato.

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.