Dela via


Använda fulltextsökning med XML-kolumner

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Du kan skapa ett fulltextindex för XML-kolumner som indexerar innehållet i XML-värdena, men ignorerar XML-markering. Elementtaggar används som tokengränser. Följande objekt indexeras:

  • Innehållet i XML-element.

  • Innehållet i XML-attribut för elementet på den översta nivån, såvida inte dessa värden är numeriska värden.

När det är möjligt kan du kombinera fulltextsökning med XML-index på följande sätt:

  1. Filtrera först DE XML-värden som är intressanta med sql-fulltextsökning.

  2. Fråga sedan de XML-värden som använder XML-index i XML-kolumnen.

Exempel: Kombinera fulltextsökning med XML-frågor

När fulltextindexet har skapats i XML-kolumnen kontrollerar följande fråga att ett XML-värde innehåller ordet "anpassad" i rubriken för en bok:

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

Metoden contains() använder fulltextindexet för att hitta de XML-värden som innehåller ordet "custom" var som helst i dokumentet. Satsen exist() ser till att ordet "anpassad" förekommer i rubriken på en bok.

En fulltextsökning som använder contains() och XQuery contains() har olika semantik. Den senare är en delsträngsmatchning och den förra är en tokenmatchning som använder stamning. Därför, om sökningen är för strängen som har "run" i titeln, kommer matchningarna att inkludera "run", "runs" och "running", eftersom både fulltext-contains() och XQuery-contains() är uppfyllda. Frågan matchar inte ordet "anpassningsbar" i rubriken, eftersom fulltext-frågan contains() misslyckas, men XQuery contains() uppfylls. För ren delsträngsmatchning bör i allmänhet contains()-satsen i fulltext tas bort.

Dessutom använder fulltextsökning ordstamning, men XQuery contains() är en exakt matchning. Den här skillnaden visas i nästa exempel.

Exempel: Fulltextsökning på XML-värden med hjälp av härstamning

XQuery-contains() kontroll som utfördes i föregående exempel kan vanligtvis inte elimineras. Tänk på den här frågan:

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

Ordet "ran" i dokumentet matchar sökvillkoret på grund av stamning. Dessutom kontrolleras inte sökkontexten med hjälp av XQuery.

När XML delas upp i relationskolumner med hjälp av AXSD som är fulltextindexerade utför inte XPath-frågor som inträffar i XML-vyn fulltextsökning i de underliggande tabellerna.

Se även