Я пытаюсь улучшить наши возможности поиска по коротким фразам (в нашем случае названия фильмов) и в настоящее время изучаю полнотекстовый поиск SQL Server 2008, который предоставляет некоторые функции, которые нам нужны:
- Слово происходит от слова (например, «пила» также означает «видеть», «видел» и т. Д.)
- Синонимы (например, «6» является синонимом «VI»)
Однако алгоритм ранжирования оказывается проблематичным, используя FREETEXTTABLE
с поисковым термином и извлекая поле RANK
. Например, когда пользователь вводит «увидел», то результаты, которые мы получаем с нашим каталогом:
RANK | Title
---------------------------------------------------------------------
180 | The Exorcist: The version you've never seen
180 | Saw IV
180 | Saw V
180 | Anybody Here Seen Jeannie?
180 | Seeing Red
Все они имеют одинаковый ранг, хотя человеку было бы ясно, что вторая и третья записи лучше соответствуют другим основополагающим терминам.
Аналогичным образом, ввод "луны" дает следующие результаты:
RANK | Title
---------------------------------------------------------------------
144 | Pink Floyd - The Dark Side of the Moon
144 | Fly Me To The Moon 3D
144 | Twilight: New Moon
144 | Moon
И здесь, несмотря на отсутствие исходящих совпадений, человеку будет ясно, что лучшим совпадением для «луны» является «Луна», а не более длинные заголовки, которые содержат его только как часть заголовка, однако FTS оценивает их в равной степени .
Я полагаю, что это, вероятно, связано с тем, как SQL Server ранжирует результаты, который обрабатывает слова и синонимы с основанием, равный весу с исходным термином, и учитывает плотность слов для ранжирования, что было бы хорошо для длинных отрывков текста, но на самом деле это не относится к таким коротким фразам. Поэтому я начинаю понимать, что, к сожалению, FTS не подходит для этой работы.
Я действительно не хочу заново изобретать колесо, так есть ли какие-нибудь поисковые решения, которые бы работали для названий и давали бы хороший рейтинг плюс функциональность stemming / thesaurus? Было бы также неплохо, если бы в нем была функция проверки орфографии для реализации функций «Вы имели в виду…», таких как Google, поэтому слово «saww» будет исправлено на «saw» и «mon» на «moon» и т. Д.