SQL关键字搜索算法:这个SQL做了顺序搜索,如何进行索引搜索?

时间:2010-12-01 21:43:28

标签: sql sql-server-2005 search-engine

我们有三个表来保存我们的产品和关键字:

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算法的链接。

2 个答案:

答案 0 :(得分:2)

就像杀了你一样,特别是使用那个完全删除列所有索引的前导通配符。

您应该考虑使用SQL Server的全文索引。 contains可能会更快,并且对于你似乎正在进行的性质的部分匹配会更加强大。

答案 1 :(得分:1)

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