Частичный поиск по ключевым словам (MS SQL 2005) - PullRequest
1 голос
/ 18 ноября 2008

В настоящее время у меня есть хранимая процедура, основная цель которой - выполнить полнотекстовый поиск по базе данных фильмов и телевизионных шоу. Чтобы заставить его выполнять частичный поиск по ключевым словам, я добавил код в SQL, чтобы разделить поисковый запрос по пробелам, и вывел оператор, подобный следующему:

"batman*" ~ "be*"

Исходная строка, например "batman be", может быть сгенерирована из текстового поля на странице, когда пользователь печатает, и при каждом событии javascript keyup я отправляю все, что находится в этом текстовом поле, в сохраненный процесс для получения результатов получить результаты, как я печатаю (например, автозаполнение). В этом случае пользователь, возможно, искал «Batman Begins» или «The Batman: Batgirl Begins» (эпизод телешоу), и в результате они оба должны появиться.

Ниже приведен пример моего запроса. В приведенном выше примере @partialKeywordString равен "batman*" ~ "be*".

SELECT f.title
FROM Films f INNER JOIN
    CONTAINSTABLE(Films, Title, @partialKeywordString) f_key ON f.filmid = f_key.[key]
ORDER BY f_key.Rank DESC

Проблема, с которой я столкнулся при запросе, заключается в том, что рейтинг не соответствует ожиданиям. Если бы я просто искал «Бэтмен», можно было бы полагать, что все названия фильмов, начиная со слова «Бэтмен» или только содержащие его, будут появляться первыми. Но они этого не делают.
Ниже приведен пример того, что происходит, когда кто-то ищет просто «бэтмэн»:

«Бэтмен: мультсериал - Эпизод 114»
«Приключения Бэтмена и Робина - Эпизод 218»
"Бэтмен и Робин - Эпизод 101"
"Бэтмен - Эпизод 101"
"Бэтмен и Робин - Эпизод 204"

Гораздо дальше в списке находится фильм, который я искал - "Бэтмен начинается" или даже просто "Бэтмен".

Я ищу совет о том, как настроить этот запрос - я определенно не эксперт по SQL, и мне кажется, что я просто обработал приведенный выше код, чтобы заставить его работать. У меня есть ощущение, что есть более элегантное или мощное решение, и я просто еще не нашел его.

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 18 ноября 2008

После еще нескольких исследований я попытаюсь использовать Lucene.Net для своей системы поиска по названию фильма, а не полагаться на полнотекстовый поиск в SQL Server 2005. Раннее тестирование показывает, что результаты были лучше и более актуально с Lucene. Поиск "batman" возвращает следующий частичный набор результатов:

  • Бэтмен
  • Бэтмен начинается
  • Возвращение Бэтмена
  • Бэтмен и Робин: Бэтмен захватывает
  • Бэтмен: прикосновение кураре
  • Бэтмен: Вавилон
  • Бэтмен: Сезон 02
  • The Batman: Topsy Turvy
  • Бэтмен и Робин: Туннель ужаса
  • Batman Beyond [Анимационный сериал]
  • Новые приключения Бэтмена: Проклятия! Смазка снова!
  • Новые приключения Бэтмена: это похоже на работу для клеща летучей мыши!
0 голосов
/ 02 декабря 2008

Я думаю, что полный текст SQL Server работает так же хорошо, но вы должны понимать, как создавать ключевые слова. Это не то же самое, что Lucene, особенно с точки зрения индексации. Я думаю, вы обнаружите, что SQL Server будет лучше с точки зрения масштабируемости и возможностей - особенно SQL 2008, теперь он является частью движка.

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