我们有三个表来保存我们的产品和关键字:SQL关键字搜索算法:此SQL执行顺序搜索,如何执行索引搜索?
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
来获得部分匹配,例如'无骨'中的'骨'。
更好的SQL算法的链接肯定会被赞赏。
在您的示例中(“无骨”中的“骨”),您可以省略第一个“%”和 - bang - 可以使用索引。 – AndreKR 2010-12-01 21:47:15