首先,似乎无法通过全文搜索获得精确匹配。当使用全文搜索方法时,这似乎是一个非常讨论的问题,并且有许多不同的解决方案可以实现所需的结果,但大多数解决方案似乎效率很低。因为我的数据库容量很大,我被迫使用全文搜索,最近不得不实施其中一种解决方案以获得更准确的结果。
由于全文搜索的工作方式,我不能使用其排名结果。例如,如果您搜索一个名为Toy Story
的电影,并且还有一个名为The Story Behind Toy Story
的电影,那么它会显示第二个结果而不是完全匹配,因为它在两个标题中都找到了单词Story
和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
这个存储过程每分钟执行大约5000次,令人惊讶的是它并没有拖垮我的服务器。但我真的很想知道是否有更有效的方法?谢谢。
CASE WHEN m.title = @title2 THEN 0 ELSE 1 END
)会评估为0。此行在所有标题不完全匹配的其他行之前列出。对于这些行,第一个表达式评估为1。 - flup