Использование полнотекстового поиска с XML-столбцами
Область применения: SQL Server
База данных SQL Azure Управляемый экземпляр SQL Azure
Для XML-столбцов можно создавать полнотекстовые индексы, индексирующие XML-значения, но игнорирующие XML-разметку. Теги элементов используются в качестве границ токенов. Индексируются следующие элементы:
Содержимое XML-элементов.
Только содержимое XML-атрибутов элемента на высшем уровне, за исключением случаев, когда эти значения являются числовыми.
Иногда можно совместно пользоваться полнотекстовым поиском и XML-индексом следующим образом.
Сначала отфильтруйте интересующие XML-значения, используя механизм полнотекстового поиска SQL.
Затем выполните запрос 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-представлении, не выполняют полнотекстовый поиск в базовых таблицах.