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


Использование полнотекстового поиска с XML-столбцами

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

Для XML-столбцов можно создавать полнотекстовые индексы, индексирующие 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() гарантирует, что слово «custom» встречается в названии книги.

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

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

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

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

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

Слово «бежать» в документе соответствует условию поиска благодаря стеммингу. Кроме того, контекст поиска не проверяется с помощью XQuery.

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

См. также