Zoeken in volledige tekst gebruiken met XML-kolommen
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
U kunt een index voor volledige tekst maken op XML-kolommen die de inhoud van de XML-waarden indexeren, maar de XML-opmaak negeert. Elementtags worden gebruikt als tokengrenzen. De volgende items worden geïndexeerd:
De inhoud van XML-elementen.
De inhoud van XML-kenmerken van het element op het hoogste niveau, tenzij deze waarden numerieke waarden zijn.
Indien mogelijk kunt u zoeken in volledige tekst combineren met XML-index op de volgende manier:
Filter eerst de interessante XML-waarden met behulp van een volledige-tekstzoekopdracht van SQL.
Voer vervolgens een query uit op de XML-waarden die gebruikmaken van de XML-index in de XML-kolom.
Voorbeeld: Zoeken in volledige tekst combineren met XML-query's
Nadat de volledige-tekstindex is gemaakt in de XML-kolom, controleert de volgende query of een XML-waarde het woord 'aangepast' bevat in de titel van een boek:
SELECT *
FROM T
WHERE CONTAINS(xCol,'custom')
AND xCol.exist('/book/title/text()[contains(.,"custom")]') = 1;
De methode contains()
maakt gebruik van de volledige-tekstindex om de XML-waarden te subset die het woord 'aangepast' overal in het document bevatten. De exist()
component zorgt ervoor dat het woord 'aangepast' voorkomt in de titel van een boek.
Een zoekopdracht in volledige tekst die gebruikmaakt van contains()
en XQuery-contains()
heeft verschillende semantiek. De laatste is een subtekenreeksovereenkomst en de eerste is een tokenovereenkomst die gebruikmaakt van stemming. Als er daarom wordt gezocht naar de tekenreeks met 'run' in de titel, bevatten de overeenkomsten 'run', 'runs' en 'running', omdat aan zowel de volledige-tekstvoorwaarde contains()
als de XQuery-voorwaarde contains()
is voldaan. De query komt echter niet overeen met het woord 'aanpasbaar' in de titel waarbij de volledige tekst contains()
niet voldoet, maar aan de XQuery contains()
wordt voldaan. Over het algemeen moet voor een pure subtekenreeksovereenkomst de volledige tekstclausule contains()
worden verwijderd.
Daarnaast maakt zoeken in volledige tekst gebruik van woordstammen, maar XQuery contains()
is een letterlijke overeenkomst. Dit verschil wordt geïllustreerd in het volgende voorbeeld.
Voorbeeld: Zoeken in volledige tekst op XML-waarden met behulp van stemming
De XQuery contains()
controle die in het vorige voorbeeld is uitgevoerd, kan over het algemeen niet worden geëlimineerd. Houd rekening met deze query:
SELECT *
FROM T
WHERE CONTAINS(xCol,'run');
Het woord 'uitgevoerd' in het document komt overeen met de zoekvoorwaarde vanwege stemming. Daarnaast wordt de zoekcontext niet gecontroleerd met behulp van XQuery.
Wanneer XML wordt opgesplitst in relationele kolommen door gebruik te maken van AXSD die volledig zijn geïndexeerd, voeren XPath-query's die plaatsvinden via de XML-weergave geen volledige-tekstzoekopdrachten uit op de onderliggende tabellen.