Как я могу использовать полнотекстовый поиск SQL Server по нескольким строкам одновременно? - PullRequest
6 голосов
/ 12 мая 2010

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

  • PostID , уникальный идентификатор для отдельной записи.
  • ThreadID , идентификатор темы, которой принадлежит сообщение. В теме может быть любое количество сообщений.
  • Текст , потому что форум был бы скучным без него.

Я хочу написать эффективный запрос, который будет искать цепочки слов в темах форума, и он должен возвращать совпадение для любого ThreadID, для которого есть сообщения, включающие все поисковые слова. Например, предположим, что в теме 9 есть сообщение 1001 со словом «кошка», а также сообщение 1027 со словом «шляпа». Я хочу, чтобы поиск cat hat возвратил удар по теме 9.

Это кажется простым требованием, но я не знаю эффективного способа сделать это. Использование обычных возможностей FREETEXT и CONTAINS для N'cat AND hat 'не возвращает никаких совпадений в приведенном выше примере, поскольку слова существуют в разных сообщениях, даже если эти сообщения находятся в одной и той же теме. (Насколько я могу судить, при использовании CREATE FULLTEXT INDEX я должен дать ему свой индекс по первичному ключу PostID и не могу сказать, чтобы он индексировал все сообщения с одинаковым ThreadID вместе.)

Решение, которое у меня есть на данный момент, работает, но отстой: ведите отдельную таблицу, содержащую полный объединенный текст сообщения каждой темы, и создавайте полнотекстовый индекс для THAT. Я ищу решение, которое не требует, чтобы я держал дубликат копии всего текста каждой темы на моих форумах. Есть идеи? Я что-то упускаю из виду?

Ответы [ 2 ]

1 голос
/ 12 мая 2010

Насколько я понимаю, нет "легкого" способа сделать это.

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

Если мне интересно, я могу написать несколько битов кода, но я предполагаю, что вам это не понадобится.

0 голосов
/ 12 мая 2010

Что вы ищете? CAT HAT как полное слово, в этом случае:

CONTAINS(*,'"CAT HAT")

Кошка или шляпа, затем ..

CONTAINS (*,'CAT OR HAT')

Поиск "CAT HAT" и ожидание только сообщения с CAT не имеет никакого смысла. Если проблема заключается в синтаксическом анализе того, что пользователь вводит, вы можете просто заменить ПРОСТРАНСТВА на ИЛИ (чтобы найти любое из слов И, если оба требуются). ИЛИ даст вам оба сообщения в теме 9.

SELECT DISTINCT ThreadId
FROM Posts 
WHERE CONTAINS (*,'"CAT OR HAT")

Еще лучше, если это поможет, использовать блестящую иронию (http://irony.codeplex.com/)), которая переводит (анализирует) строку поиска в полнотекстовый запрос. Может помочь вам.

Требуется использование синтаксиса Google для исходного поиска, что может быть только полезным, так как большинство людей привыкли набирать в поиске Google.

Плюс вот статья о том, как его использовать. http://www.sqlservercentral.com/articles/Full-Text+Search+(2008)/64248/

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