Używanie wyszukiwania pełnotekstowego z kolumnami XML
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Indeks pełnotekstowy można utworzyć w kolumnach XML, które indeksują zawartość wartości XML, ale ignorują znaczniki XML. Tagi elementów są używane jako granice tokenów. Indeksowane są następujące elementy:
Zawartość elementów XML.
Zawartość atrybutów XML tylko elementu najwyższego poziomu, chyba że te wartości są wartościami liczbowymi.
Jeśli to możliwe, możesz połączyć wyszukiwanie pełnotekstowe z indeksem XML w następujący sposób:
Najpierw przefiltruj interesujące wartości XML przy użyciu wyszukiwania pełnotekstowego SQL.
Następnie wykonaj zapytanie względem tych wartości XML, które używają indeksu XML w kolumnie XML.
Przykład: łączenie wyszukiwania pełnotekstowego z wykonywaniem zapytań XML
Po utworzeniu indeksu pełnotekstowego w kolumnie XML następujące zapytanie sprawdza, czy wartość XML zawiera słowo "custom" w tytule książki:
SELECT *
FROM T
WHERE CONTAINS(xCol,'custom')
AND xCol.exist('/book/title/text()[contains(.,"custom")]') = 1;
Metoda contains()
używa indeksu pełnotekstowego do wybierania wartości XML, które zawierają słowo "custom" w dowolnym miejscu w dokumencie. Klauzula exist()
gwarantuje, że słowo "custom" występuje w tytule książki.
Wyszukiwanie pełnotekstowe korzystające z contains()
i XQuery contains()
ma różne semantyki. Ten drugi jest dopasowaniem podciągu, a ten pierwszy jest dopasowaniem tokenu, który używa stemowania. W związku z tym, jeśli wyszukiwanie dotyczy ciągu, który ma ciąg "run" w tytule, dopasowania będą zawierać ciąg "run", "runs" i "running", ponieważ zarówno pełnotekstowe contains()
, jak i contains()
XQuery są spełnione. Jednak zapytanie nie jest zgodne ze słowem "konfigurowalnym" w tytule w tym, że wyszukiwanie pełnotekstowe contains()
kończy się niepowodzeniem, ale warunek contains()
XQuery został spełniony. Ogólnie rzecz biorąc, w przypadku dopasowania czystego podciągu należy usunąć pełnotekstową klauzulę contains()
.
Ponadto wyszukiwanie pełnotekstowe używa sprowadzania do rdzenia wyrazów, ale XQuery contains()
jest dopasowaniem dosłownym. Ta różnica jest pokazana w następnym przykładzie.
Przykład: wyszukiwanie pełnotekstowe wartości XML przy użyciu funkcji stemming
Nie można generalnie wyeliminować sprawdzenia contains()
XQuery, które zostało wykonane w poprzednim przykładzie. Rozważ następujące zapytanie:
SELECT *
FROM T
WHERE CONTAINS(xCol,'run');
Słowo "uruchomione" w dokumencie pasuje do warunku wyszukiwania z powodu stemmingu. Ponadto kontekst wyszukiwania nie jest sprawdzany przy użyciu zapytania XQuery.
Gdy XML jest rozłożony na kolumny relacyjne przy użyciu AXSD, które są indeksowane pełnotekstowo, zapytania XPath występujące w widoku XML nie wykonują wyszukiwania pełnotekstowego w tabelach bazowych.