MSSQL 2005 Настройка полнотекстового поиска - PullRequest
0 голосов
/ 29 декабря 2008

Я начинаю набег на полнотекстовый поиск по MSSQL2005. Это новая in-dev база данных, поэтому я могу с ней разбираться.

Допустим, у меня есть таблица «Форма», которая имеет отношение «один ко многим» с двумя другими таблицами: «Ответ» и «Комментарий». Я хочу, чтобы пользователь мог ввести один поисковый запрос и сделать так, чтобы он привязывал все три таблицы с помощью полнотекстового поиска. Какой лучший способ? Кажется, что я могу создать индексированное представление , чтобы ускорить процесс.

Если я использую индексированное представление (это лучший маршрут в любом случае?), Как мне справиться с отношениями один-ко-многим? Давайте предположим, что все, что я действительно хочу выяснить, - это идентификатор таблицы «Форма», которая будет содержать любые результаты поиска, найденные в дочерних таблицах «Ответ / комментарий», поэтому я могу показать всю форму, содержащую найденные записи. Внутреннее соединение в представлении приведет к возвращению нескольких «главных» строк формы - это не очень хорошо для производительности. Как насчет объединения всех дочерних строк ответа / комментария в один «столбец» для представления? Так что вместо ....

Form 1, Answer A, Comment A 
Form 1, Answer B, Comment A 
Form 1, Answer A, Comment B 
Form 1, Answer B, Comment B

... это было бы ...

Form 1, Answer A Answer B, Comment A Comment B

Помните, что все, что меня волнует, это идентификатор этой главной строки "формы".

Это кажется мне логичным, но я не уверен, что лучшие практики по полнотекстовому поиску еще есть, поэтому просто любопытно, правильно ли я к нему подхожу.

ОБНОВЛЕНИЕ: Похоже, что индексированные представления довольно строгие; нет левых соединений, нет подзапросов, поэтому я мог бы пойти по пути сводной таблицы, заполненной триггерами, если она не будет слишком громоздкой.

1 Ответ

1 голос
/ 30 декабря 2008

В SQL вы должны использовать это правило: - начать с элемента, который вы хотите получить - добавить фильтры, чтобы ограничить набор элементов для извлечения

это звучит как ежу понятно, но это действительно все, что вам нужно сделать. Здесь вы хотите элементы формы (строки), поэтому вы пишете:

SELECT ID
FROM Form

и затем вы добавляете фильтры, чтобы ограничить общий набор набором форм, которые вас интересуют. Это делается с помощью предикатов IN. Поскольку вы говорите, что Ответ и Комментарий имеют отношение 1: n к Форме, это означает, что Ответ и Комментарий имеют FK для Form.ID. Таким образом, мы можем добавить где:

WHERE ID IN
(SELECT FormID FROM Answer WHERE CONTAINS(FullTextColumnInAnswer, @stringToSearch))
OR
ID IN
(SELECT FormID FROM Comment WHERE CONTAINS(FullTextColumnInComment, @stringToSearch))

это приведет к набору значений Form.ID, которые различны и являются идентификаторами форм, которые имеют как минимум 1 ответ ИЛИ комментарий, который содержит строку для поиска в поле, для которого включен полнотекстовый поиск.

В SqlServer 2000 это может быть медленнее, чем в 2005 году, поскольку вы используете несколько операторов CONTAINS.

Вместо этого вы также можете использовать CONTAINSTABLE () в сценариях соединения, см. BOL для примеров, хотя сначала я хотел бы воспользоваться настройкой предложения IN, чтобы все заработало.

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