Поделиться через


Полнотекстовый индекс XML-столбца

Для XML-столбцов можно создавать полнотекстовые индексы, индексирующие XML-значения, но игнорирующие XML-разметку. К значениям атрибута, если они не являются числовыми значениями, применяется полнотекстовый индекс. Теги элементов используются в качестве границ лексем. Иногда можно совместно пользоваться полнотекстовым поиском и XML-индексом следующим образом.

  1. Сначала отфильтруйте интересующие XML-значения, используя механизм полнотекстового поиска SQL.

  2. Затем запросите XML-значения, которые используют XML-индекс, связанный с XML-столбцом.

Пример. Комбинирование полнотекстового поиска с запросами XML-данных

После создания полнотекстового индекса для XML-столбца следующий запрос проверяет, что название книги содержит слово «custom»:

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

В методе contains() полнотекстовый индекс используется для выделения всех XML-значений, содержащих слово «custom». Предложение exist() гарантирует, что это слово входит в название книги.

Инструкции полнотекстового поиска, в которых используются метод contains() и одноименный метод языка XQuery, имеют различную семантику. Во втором случае выполняется сопоставление подстрок, а в первом — сопоставление маркеров с применением лемматизации. Таким образом, если искать строку, содержащую в заголовке слово «run», в число найденных вариантов войдут «run», «runs» и «running», потому что они соответствуют требованиям как метода contains() механизма полнотекстового поиска, так и метода contains() языка XQuery. Однако условия нашего запроса не соответствуют слову «customizable» в заголовке, хотя условия метода contains() языка XQuery были бы удовлетворены. Как правило, чтобы провести истинное сопоставление подстрок, метод contains() механизма полнотекстового поиска использовать не следует.

Кроме того, при полнотекстовом поиске выполняется лемматизация, а метод contains() языка XQuery осуществляет буквальное сопоставление. Это различие поясняет следующий пример.

Пример. Полнотекстовый поиск XML-значений с использованием парадигматического модуля

Проверку contains() языка XQuery, выполненную в предыдущем примере, обычно устранить нельзя. Рассмотрим следующий запрос:

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

Слово «run» в документе соответствует условию поиска, потому что при этом осуществляется лемматизация. Кроме того, при использовании XQuery не проверяется контекст поиска.

Если при помощи схем XML-данные распределены по реляционным столбцам, для которых выполнено полнотекстовое индексирование, при обработке запросов XPath, адресованных XML-представлению, полнотекстовый поиск в базовых таблицах не выполняется.

См. также

Основные понятия