Полнотекстовый поиск в объединенных иерархических записях в SQL Server 2008 - PullRequest
1 голос
/ 15 июля 2009

Вероятно, вопрос нуб, но я все же пойду на него.

Для примера, у меня есть таблица Person, таблица Tag и таблица ContactMethod. Человек будет иметь несколько записей Tag и несколько записей ContactMethod, связанных с ними.

Я хотел бы иметь прощающий поиск, который будет искать среди нескольких полей из каждой таблицы. Поэтому я могу найти человека по его электронной почте (через ContactMethod), по его имени (через Person) или по назначенному ему тегу.

В качестве полной идеи для FTS на ум приходят два подхода:

  1. Создайте сложный запрос, который обращается к каждому полю индивидуально
  2. Создайте некоторую таблицу поиска, которая объединит поля, которые я хочу проиндексировать, и просто выполните полнотекстовый запрос к этой производной таблице.

(Не стесняйтесь редактировать для ясности; меня не интересуют точки повторения.)

Ответы [ 3 ]

0 голосов
/ 15 июля 2009

FTS может искать несколько полей вне коробки. Предикат CONTAINS принимает список столбцов для поиска. Также CONTAINSTABLE .

0 голосов
/ 15 июля 2009

Если ваш sql-сервер поддерживает это, вы можете создать индексированное представление и полнотекстовый поиск, который; вы можете использоватьabletable (*, '"chris"'), чтобы прочитать все столбцы.

Если он не поддерживает это, поскольку поля все взяты из разных таблиц, я думаю для масштабируемости; если вы можете легко заполнить поля в одну строку для каждой записи в отдельной таблице, я бы выполнял полнотекстовый поиск, а не отдельные записи. В итоге вы получите менее сложный каталог FTS, и ваши запросы не должны будут выполнять 4 полнотекстовых поиска одновременно. Выполнение большого количества отдельных запросов FTS к разным таблицам одновременно - это мой опыт решения проблем производительности. Недостатком этого является то, что вы теряете возможность самостоятельно искать фамилию; если это то, что вам нужно, вам, возможно, придется поискать альтернативу.

В нашем приложении мы обнаружили, что одна таблица была быстрее (мы не можем полагаться на клиентов, имеющих под рукой корпоративный sql); поэтому мы заполняем данные пробелами в таблицу FTS через обновление sp, после чего наш главный контактный поиск выполняет поиск по списку. У нас есть два отдельных поиска для точного поиска вещей (например, имен или телефонных номеров) или просто для свободного текста. Еще одна приятная вещь в таблице - это относительно легко и недорого добавить дополнительные столбцы в поиск (например, нас попросили указать номер социального страхования; чтобы сделать это, мы просто добавили столбец к обновлению SP, и нас уже не было) с небольшим воздействием или без него.

0 голосов
/ 15 июля 2009

Одна из возможностей - создать представление с такими столбцами: PersonID, ContentType, Content. ContentType будет что-то вроде «Email», «PhoneNumber» и т. Д., И Content будет содержать это. Вы будете искать в столбце «Содержимое» и сможете увидеть, какой у этого человека идентификатор. Я не уверен на 100%, как работает полнотекстовый поиск, поэтому я не уверен, что вы могли бы использовать это в представлении.

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