2010-12-01 132 views
0

我们有三个表来保存我们的产品和关键字: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算法的链接肯定会被赞赏。

+1

在您的示例中(“无骨”中的“骨”),您可以省略第一个“%”和 - bang - 可以使用索引。 – AndreKR 2010-12-01 21:47:15

回答

2

就像是在扼杀你,尤其是那个领先的通配符,它​​可以完全删除列可能有的任何索引。

你应该看看使用SQL Server的全文索引。 contains可能会快得多,而且对于你看起来正在做的部分性质的部分匹配更有效。

1

好吧,您可以在该列上实现全文索引,这将有助于选择语句的执行,但会损害其他三个CRUD操作的性能,因为索引需要在每个操作上更新。然后我相信你会使用CONTAINS或其他类似的关键字。这里有更多information