Полнотекстовый поиск SQL XML

Я реализую функцию поиска в веб-приложении и включил полнотекстовый поиск в ряде столбцов в моей таблице.

Один из этих столбцов имеет тип данных «xml», и в настоящее время я использую XQuery, чтобы убедиться, что поиск выполняется только в определенных узлах.

Вот пример части XQuery SQL-запроса (SQL-Query — это сгенерированный/динамический запрос)

XMLContent.exist('/Template/Fields/Field/Text/text()[contains(.,"search-phrase1") or contains(.,"search-phrase2") or contains(.,"etc.")]') = 1

Динамический запрос может включать в запрос любое количество поисковых фраз.

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

Мой вопрос заключается в том, быстрее ли использовать функцию CONTAINS в sql для поиска всего столбца XMLContent или быстрее, когда я сужаю ее до определенных узлов в xml?

Имеют ли разные методы свои преимущества, за исключением того, что CONTAINS проверяет все узлы, а не указанный?


person DOOMDUDEMX    schedule 03.10.2014    source источник


Ответы (1)


Это 2 разные функции. Они не разговаривают друг с другом.

  1. Полный текст содержит: Содержит (XmlContent, «Форд»)
  2. Xml содержит: XmlContent.exist('/Cars/text()[содержит(.,"Ford")]') =1

У меня есть таблица с 10 000 строк, выполните менее 3 запросов в SSMS с Включить фактический план выполнения.

Select * from TableA where Contains(XmlContent,'Ford') and XmlContent.exist('/Cars/text()[contains(.,"Ford")]') =1
Select * from TableA where Contains(XmlContent,'Ford')
Select * from TableA where XmlContent.exist('/Cars/text()[contains(.,"Ford")]') =1

План выполнения показывает

Query1: Query Cost (relative to the batch): 3%
Query2: Query Cost (relative to the batch): 2%
Query3: Query Cost (relative to the batch): 95%

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

Не уверен насчет конкретного узла, вы можете написать аналогичные запросы в SSMS, он сообщит вам, работает ли он.

Вот страница MSDN.

person Rm558    schedule 08.10.2014