полнотекстовый поиск и XML-контент в SQL Server 2005 - PullRequest
2 голосов
/ 05 октября 2011

У меня есть таблица с полем типа данных xml в sql server 2005, я храню в ней содержимое xml и включил полнотекстовый поиск по ней.

Проблема, с которой я сталкиваюсь, заключается в том, что при поиске не выбираются значения атрибутов, хранящиеся в поле. Он ищет текстовые записи на узле.

Вот мой запрос:

  select * from document_content where FREETEXT (doc_content_xml,'"2010 SKCA 136 para 46"')

В данных у меня есть следующий узел xml, который содержит этот текст в качестве атрибута, но результат поиска показывает 0 результатов.

  <p class="para">
  <number value="2010 SKCA 136 para 46" class="num">
  [46]
 </number>
 </p>

Это поиск, если разметка похожа на

  <p class="para">
  <number value="2010 SKCA 136 para 46" class="num">
  2010 SKCA 136 para 46
 </number>
 </p>

Любая помощь будет оценена.

1 Ответ

1 голос
/ 21 декабря 2011

Насколько я знаю, эти атрибуты никогда не будут проиндексированы. Я нахожусь в той же ситуации, что и вы, и ничто из того, что я прочитал, не говорит мне иначе. Именно так работает полнотекстовая индексация SQL для типа данных XML. Существует нечто с именем iFilter, которое определяет, как оно индексируется, и его нельзя переопределить. То же самое относится и к другим типам данных.

Сервер MS SQL будет индексировать только значения XML и только те атрибуты, которые имеют «верхний уровень, а не число».

Вы можете сохранить XML как тип данных «FILE» в SQL и реализовать свою собственную dll iFilter, которую вы затем зарегистрируете в Windows на сервере SQL и зарегистрировать тип файла iFilter, соответствующий типу файла вашего типа данных «FILE». , Это сложная вещь, которую вы должны сделать в C ++.

Если в XML не выполняются запросы XPath, вы всегда можете изменить тип на varchar или любой другой тип TEXT, который будет проиндексирован как текст.

Возможно, можно добавить столбец метаданных, который существует только для поиска. Копия XML в столбце varchar (max), который будет проиндексирован как текст.

Мой XML содержит ваш типичный ключ, информацию о значении, где ключ хранится как атрибут, и я не могу получить к нему доступ с помощью Contains (), поскольку индексируется только значение.

UPDATE: Решение, которое я выбрал, заключается в полнотекстовой индексации XML, а затем в 2 этапа поиска. Пропуск 1 сужает результат XML путем полнотекстового поиска. Проход 2 выполняет запрос XPath, чтобы в итоге получить результат. Это намного быстрее, чем только XPath.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...