Udostępnij za pośrednictwem


Używanie wyszukiwania pełnotekstowego z kolumnami XML

Dotyczy:SQL ServerAzure SQL DatabaseAzure 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:

  1. Najpierw przefiltruj interesujące wartości XML przy użyciu wyszukiwania pełnotekstowego SQL.

  2. 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.

Zobacz też