Во-первых, похоже, что нет способа получить точное соответствие, используя полнотекстовый поиск. По-видимому, это очень обсуждаемая проблема при использовании полнотекстового метода поиска, и для достижения желаемого результата существует множество различных решений, однако большинство из них кажется очень неэффективным. Поскольку я вынужден использовать полнотекстовый поиск из-за объема моей базы данных, мне недавно пришлось реализовать одно из этих решений, чтобы получить более точные результаты.
Я не мог использовать результаты ранжирования из полнотекстового поиска из-за того, как он работает. Например, если вы искали фильм под названием Toy Story
, а также фильм под названием The Story Behind Toy Story
, который появился бы вместо точного соответствия, потому что он нашел слово Story
дважды и Toy
.
Я отслеживаю свои собственные рейтинги, которые я называю "Популярность" каждый раз, когда пользователь получает доступ к записи, номер увеличивается. Я использую этот datapoint для взвешивания моих результатов, чтобы определить, что пользователь может искать.
У меня также есть проблема, когда иногда приходится возвращаться к поиску LIKE и не возвращать точное соответствие. То есть поиск Goonies
должен возвращать The Goonies
(самый популярный результат)
Итак, вот пример моей текущей хранимой процедуры для этого:
DECLARE @Title varchar(255)
SET @Title = '"Toy Story"'
--need to remove quotes from parameter for LIKE search
DECLARE @Title2 varchar(255)
SET @Title2 = REPLACE(@title, '"', '')
--get top 100 results using full-text search and sort them by popularity
SELECT TOP(100) id, title, popularity As Weight into #TempTable FROM movies WHERE CONTAINS(title, @Title) ORDER BY [Weight] DESC
--check if exact match can be found
IF EXISTS(select * from #TempTable where Title = @title2)
--return exact match
SELECT TOP(1) * from #TempTable where Title = @title2
ELSE
--no exact match found, try using like with wildcards
SELECT TOP(1) * from #TempTable where Title like '%' + @title2 + '%'
DROP TABLE #TEMPTABLE
Эта хранимая процедура выполняется около 5000 раз в минуту, и она достаточно сумасшедшая, чтобы не довести мой сервер до колен. Но я действительно хочу знать, был ли более эффективный подход к этому? Спасибо.