灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2962回复:0

[SQL Server]SQL Server difference函数的近似值操作

楼主#
更多 发布于:2012-09-04 18:04


全名:搜索引擎算法的胡乱猜测 - SQL Server difference函数的近似值操作


最近正在对SQL Server所有内置函数进行一个通参(呵呵,自己造的词,其实就是从头到尾过一遍),进行到difference函数的时候简单的在IDE中进行了小小的尝试,目标代码如下:
1 declare @input nvarchar(100)='shenme'
2 declare @targetItem nvarchar(100)='ShenMa收藏'
3 select DIFFERENCE(@input,@targetItem)as result

返回值如下:
result
-----------
4

(1 行受影响)

返回值为4,表明用户输入的值与进行比较的值是完全匹配的,但事实并不是这样'shenme'和'ShenMa收藏社区'明显是不一样的,只不过有几分相似而已,好,SQL Server中的相似值操作,就是我在这里要记录的(这句话换做大牛的说法是:好,这就是我们本节要讲的)。
difference返回值介绍:返回的整数是 SOUNDEX 值中相同字符的个数。返回的值从 0 到 4 不等:0 表示几乎不同或完全不同,4 表示几乎相同或完全相同。

首先需要讲明白的是,我要记录的是近似值操作,而并非类似四舍五入的操作:ROUND函数,他的作用是返回一个数值,舍入到指定的长度或精度。而我们这里要讨论的是: DIFFERENCE函数。
DIFFERENCE 返回一个整数值,指示两个字符表达式的 SOUNDEX 值之间的差异。

什么是SOUNDEX值?
SOUNDEX是一种语音算法,利用英文字的读音计算近似值,值由四个字符构成,第一个字符为英文字母,后三个为数字。在拼音文字中有时会有会念但不能拼出正确字的情形,可用Soundex做类似模糊匹配的效果。例如Knuth和Kant二个字符串,它们的Soundex值都是「K530」。
算法简要说明:
将英文字按以下规则替换(不使用第一个字符进行匹配):
   a e h i o u w y -> 0
   b f p v -> 1
   c g j k q s x z -> 2
   d t -> 3
   l -> 4
   m n -> 5
   r -> 6

去除0,对于重复的字符只保留一个
返回前4个字符,不足4位以0补足
以Knuth和Kant为例:

Knuth -> K5030 -> K53 -> K530
Kant  -> K053  -> K53 -> K530

不知道大家看明白了没有,我来简单说一下,比如目标字符串是Knuth,我们不使用第一个字符进行匹配,也就是不使用k,而将k作为匹配结果的第一个字符,所以第一个字符就得到了,他就是k,然后使用第二个字符进行匹配:n,n在以上匹配表中处于的位置是第六行,对应后边的数字为5,所以第二个匹配的字符也找到了,更新现在的结果字符串,就是k5,然后结合去除0,重复字符只保留一个等其他规则以此类推,就得到了最后的结果。
有人会问,这个difference函数有什么用,我要匹配相似结果的时候用like不就行了,是的,我们可以用like,但是试想一下这样的情况,我们在web应用程序的搜索栏中输入了“对比”两个字,搜索一下,发现结果为0,而数据库中却有一条名为:“比对“的记录,而且他们长的竟然那么像,所以实际情况中,我们是希望这样的数据能够被检索出来,以供用户浏览或处理的,所以这就是你经常使用的like关键字,我们可以复制一下代码,在MSSQLSERVER的IDE中运行一下,查看结果是不是跟我的执行结果一样。

declare @item1 nvarchar(20)='对比'
declare @item2 nvarchar(20)='比对'

create table #tblTemp(item nvarchar(20))
insert into #tblTemp select @item2

select * from #tblTemp    --显示临时表数据
select * from #tblTemp where item like '+'+@item1+'+'
drop table #tblTemp        --注:临时表删除

执行上述代码,返回结果为:

60_3710_23ba29856b1e56e.png[删除]

很明显,查找结果为空。


但是如果我们使用difference关键字,结果可能就不一样了,执行一下代码:

declare @item1 nvarchar(20)='对比'
declare @item2 nvarchar(20)='比对'
select SOUNDEX(@item1) item1,SOUNDEX(@item2) item2,DIFFERENCE(@item1,@item2) result

返回结果为:

60_3710_64cc5f25817d2fe.png[删除]上面我们说过,返回值为4,表明进行比较的两个字符串完全一样,我们仔细看一下他们的SOUNDEX值就可以了,都是0000,这样的话,类似上述情况的数据我们就可以检索出来,这种功能有时候是非常有用的。


关于diffrence函数的实际应用情况,我还在摸索当中,记得以前看过一本书(仅仅是看过书名,连翻都没翻过)叫《自己动手写搜索引擎》,是不是用的搜索算法也跟这个有点类似呢,google什么算法不知道,好像baidu是买的香港某大学的一个搜索算法,总之功能是匹配用户输入的数据并做相似度匹配,所以我的标题中有一部分叫:搜索引擎算法的胡乱猜测,呵呵,如果你有更好的见解,不妨告诉我啊,另外,大虾们看到之后请轻喷哈。


喜欢0 评分0
游客

返回顶部