2009-07-14 7 views
1

Возможно, вопрос о нобе, но я все равно пойду за него.Полнотекстовый поиск по зарегистрированным, иерархическим записям в SQL Server 2008

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

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

Как полный нуб в FTS, два подхода приходит на ум:

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

(. Вы можете изменить для ясности, я не в этом для точек репы)

+0

Это не столько запрос на разъяснение от вас самих, сколько из общего сообщества Stack Overflow, но действительно ли это работа для полнотекстового поиска? Мое понимание всегда заключалось в том, что FTS предназначен для поиска больших блоков текста в базе данных - это неверно? Учитывая, что описания, поля контакта и тега, как мне кажется, мало меняются, может ли это не обрабатываться связью запросов LIKE? –

+0

@Ken: Это не только вопрос размера, но и FTS может делать лингвистические вещи LIKE не может, как тезаурус, прерыватель слов, стволовые клетки и т. Д. –

+0

MS написала хорошую статью http://technet.microsoft.com/en-us /library/ms345119(SQL.90).aspx «Запрос LIKE (например,«% cencini% ») против миллионов строк текстовых данных может занять несколько минут, тогда как полнотекстовый запрос (для« cencini ») может принимать только секунды или меньше по тем же данным, в зависимости от количества возвращаемых строк. " – u07ch

ответ

0

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

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

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

0

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

0

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

+0

Я вижу, как я могу запросить несколько столбцов, но я (неосведомленно) не знаю, относится ли это к проблеме иерархических данных. Мысли? – Larsenal

Смежные вопросы