- 没有文章
现在很多网站都提供了站内的搜索功能,有的很简单在SQL语句里加一个条件如:where names like ‘%words%’就可以实现最基本的搜索了。
我们来看看功能强大一点,复杂一点的搜索是如何实现的(在SQL SERVER200/2005通过存储过程实现搜索算法)。
我们把用户的搜索可以分为以下两种:
1.精确搜索,就是把用户输入的各个词语当成一个整体,不分割搜索.
2.像百度,GOOGLE一样的,按空格把输入的每一个词分离,只要包含这些词语,而不管出现的顺序,称为ALL-word Search.
3.对输入的词只要有一个出现就为匹配 称为Any-word Search
一、对搜索结果进行排序的算法
在前面提到的LIKE语句最大的问题就是搜索的结果是没有经过排序的,我们不知道结果出现在的顺序是如何的,因为它是随机的。像百度,GOOGLE都会对结果用算法进行排序再显示的.好我们也来建立一个简单的排序法。一个很常见的算法是计算关键词在被搜索内容中出现的次数,次数最多的排在结果的第一位。我们的是在存储过程中实现这个算法的,而在SQLSERVER中没有提供计算关键词在被搜索内容中出现的次数这样的函数,我们要自己写一个UDF(User-Defined Functions),UDF是SQLSERVER的内部函数,可以被存储过程调用或者被其他UDF调用。函数如下:
CREATE FUNCTION dbo.wordCount2

3
(@word VARCHAR(15), 4

5
@Phrase VARCHAR(1000))6

7
RETURNS SMALLINT8

9
AS10

11
BEGIN12

13

/**//* 如果@word 或者@Phrase 为空返回 0 */14

15
IF @word IS NULL OR @Phrase IS NULL RETURN 016

17

/**//* @Biggerword 比@word长一个字符 */18

19
DECLARE @Biggerword VARCHAR(21)20

21
SELECT @Biggerword = @word + 'x'22

23

/**//*在 @Phrase用@Biggerword替换@word */24

25
DECLARE @BiggerPhrase VARCHAR(2000)26

27
SELECT @BiggerPhrase = REPLACE (@Phrase, @word, @Biggerword)28

29

/**//* 相减结果就是出现的次数了 */30

31
RETURN LEN(@BiggerPhrase) - LEN(@Phrase)32

33
END34

以上就是整个UDF,它用了一个很高效的方法来计算关键词出现的次数。
二、参数传递
用户输入的关键词从一个到多个不等,我们可以把参数固定为@word1~@word5,这样比较方面实现。当用户输入超过5个时,忽略不计,少于5个的地方视为空。其实GOOGLE也是这样做的,只是GOOGLE的最大词语限制是10个。
三、搜索的实现过程
假定我们对Product表进行搜索,Product字段有:Id,Name ,Descripton(产品描述),搜索要同时对Name 和 Description进行。
Any-World Search实现如下:
SELECT Product.Name, 2
3 * wordCount(@word1, Name) + wordCount(@word1, Description) +3

4
3 * wordCount(@word2, Name) + wordCount(@word2, Description) +5

6

7

8
AS Rank9
FROM Product附件:
没有附件
票
顶一下
票
踩一下
| 文 章 评 论 | ||||||||
| ||||||||



您现在的位置: