Как я могу использовать полнотекстовый поиск SQL Server через несколько строк сразу?

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

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

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

Это походит на простое требование, но я не знаю об эффективном способе сделать это. Используя регулярный FREETEXT и СОДЕРЖИТ возможности N'cat, И шляпа' не возвратит хитов в вышеупомянутом примере, потому что слова существуют в различных сообщениях, даже при том, что те сообщения находятся в том же потоке. (Насколько я могу сказать, когда использование СОЗДАЕТ ПОЛНОТЕКСТОВЫЙ ИНДЕКС, я должен дать ему свой индекс на первичном ключе PostID и не могу сказать ему индексировать все сообщения с тем же ThreadID вместе.)

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

6
задан Travis 12 May 2010 в 07:05
поделиться

2 ответа

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

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

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

1
ответ дан 17 December 2019 в 22:11
поделиться

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

CONTAINS(*,'"CAT HAT")

CAT OR HAT...

CONTAINS (*,'CAT OR HAT')

Искать "CAT HAT" и ожидать только пост с CAT внутри не имеет никакого смысла. Если проблема заключается в разборе того, что набирает пользователь, вы можете просто заменить SPACES на OR (для поиска любого из слов, AND - если требуется оба слова). OR даст вам оба сообщения для темы 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/

0
ответ дан 17 December 2019 в 22:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: