Я пытаюсь улучшить функциональность поиска относительно своих веб-форумов. У меня есть таблица сообщений, и каждое сообщение имеет (среди других менее интересных вещей):
Я хочу записать эффективный запрос, который будет искать потоки на форуме для серии слов, и он должен возвратить хит для любого ThreadID, для которого существуют сообщения, которые включают все поисковые слова. Например, скажем, тот поток 9 имеет сообщение 1001 со словом "кошка" в нем, и также отправьте 1027 со словом "шляпа" в нем. Я хочу, чтобы поиск шляпы кошки возвратил хит для потока 9.
Это походит на простое требование, но я не знаю об эффективном способе сделать это. Используя регулярный FREETEXT и СОДЕРЖИТ возможности N'cat, И шляпа' не возвратит хитов в вышеупомянутом примере, потому что слова существуют в различных сообщениях, даже при том, что те сообщения находятся в том же потоке. (Насколько я могу сказать, когда использование СОЗДАЕТ ПОЛНОТЕКСТОВЫЙ ИНДЕКС, я должен дать ему свой индекс на первичном ключе PostID и не могу сказать ему индексировать все сообщения с тем же ThreadID вместе.)
Решение, что я в настоящее время имею в распоряжении работы, но сосу: поддержите отдельную таблицу, которая содержит весь связанный текст сообщения каждого потока, и сделайте полнотекстовый индекс на ЭТОМ. Я ищу решение, которое не требует, чтобы я сохранил дубликат всего текста каждого потока на моих форумах. Какие-либо идеи? Я пропускаю что-то очевидное?
Насколько я могу судить, не существует "простого" способа сделать это.
Я бы создал хранимую процедуру, которая просто разбивает слова для поиска и начинает искать первое слово и помещает threadid's в табличную переменную. Затем вы ищете другие слова (если они есть) в потоковых переменных, которые вы только что собрали (внутреннее соединение).
Если интересно, я могу написать несколько битов кода, но я думаю, что вам это не понадобится.
Что вы ищете? 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/