我们有三个表来保存我们的产品和关键字:
Product {int ID, string name, ...}
ProductKeyword {int productID, int keywordID}
Keyword {int ID, string keyword}
此SQL代码将最相关的产品返回到具有关键字(如用户搜索条件)的最不相关的产品。 searchWordTable是一个搜索词表。 @keywordCount
是搜索词的计数。这将返回包含一个或多个关键字的所有产品,并按每个产品的关键字数量排序。
select productid, productname, count(*) * 1 / @keywordCount as percentRelevant
from (select keyword, productid, productname
from product
join productkeyword on ...
join keyword on ...
join searchWordTable on searchwordtable.keyword like
'%' + keyword.keyword + '%') K -- like join aweful
group by productid, productname
order by percentRelevant desc -- Most relevant first
问题是这是一个顺序搜索,比较我们拥有的每个关键字。这还不错,但搜索可能需要一分钟,有一百万条记录。
如何重写查询以不使用like
,希望使用索引搜索,并获得类似的结果?他们使用like
来获得部分匹配,例如'boneless'中的'bone'。
肯定会赞赏更好的SQL算法的链接。
答案 0 :(得分:2)
就像杀了你一样,特别是使用那个完全删除列所有索引的前导通配符。
您应该考虑使用SQL Server的全文索引。 contains
可能会更快,并且对于你似乎正在进行的性质的部分匹配会更加强大。
答案 1 :(得分:1)
好吧,你可以在该列上实现一个全文索引,这将有助于select语句的执行,但会损害其他三个CRUD操作的性能,因为索引需要在每个操作上更新。然后我相信你会使用CONTAINS或其他类似的关键字。这里还有一些information。