首先,似乎没有办法使用全文搜索获得完全匹配。在使用全文搜索方法时,这似乎是一个被高度讨论的问题,并且有许多不同的解决方案可以达到预期的结果,但大多数似乎效率很低。由于我的数据库量很大,我被迫使用全文搜索,因此我最近不得不实施其中一种解决方案以获得更准确的结果。
由于它的工作原理,我无法使用全文搜索的排名结果。例如,如果您搜索一部名为的电影Toy Story
,并且还有一部名为的电影The Story Behind Toy Story
,它会出现而不是完全匹配,因为它Story
两次找到了单词 and Toy
。
每次用户访问记录时,我都会跟踪我自己的排名,我称之为“人气”,这个数字会上升。我使用这个数据点来衡量我的结果,以帮助确定用户可能在寻找什么。
我也有有时需要回退到 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
这个存储过程每分钟执行大约 5,000 次,而且很疯狂,它并没有让我的服务器瘫痪。但我真的很想知道是否有更有效的方法来解决这个问题?谢谢。