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

Применяется к:SQL ServerAzure SQL DatabaseAzure, управляемому экземпляру 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", "run", "run" и "run", так как полнотекстовые contains() и XQuery contains() удовлетворены. Однако запрос не соответствует слову "настраиваемая" в заголовке, в котором завершается сбой полнотекстового текста contains() , но XQuery contains() удовлетворен. Как правило, для чистого соответствия подстроки необходимо удалить полнотекстовый contains() предложение.

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

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

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

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

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

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

См. также