65.9K
CodeProject 正在变化。 阅读更多。
Home

MS SQL Server 的简化语音搜索

starIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

1.00/5 (1投票)

2007年11月1日

CPOL

1分钟阅读

viewsIcon

38267

使用 Soundex 在 MS SQL Server 上执行语音搜索。

引言

我最近发现了 SQL Server 的语音搜索功能,并在这里实现了一个示例。

背景

关于 Soundex 的一个非常有趣的事情是,匹配算法在 1917 年获得了专利,我认为甚至早于电子计算器的发明,或者接近于灯泡的发明。请查看 http://www.creativyst.com/Doc/Articles/SoundEx1/SoundEx1.htm

使用代码

存储过程接受表名、逗号分隔的列列表作为结果列表、要搜索的列名作为 MatchColumn、要搜索的搜索字符串以及在未找到完全匹配项时建议的最大数量。

存储过程检查作为参数传递的表中是否存在匹配记录,并充当

  • 找到完全匹配项 - 以提供的列列表形式返回包含所有匹配记录的结果集。
  • 未找到匹配项 - 执行语音搜索并返回两个额外的结果集:第一个是完全匹配项(无记录),第二个是使用语音搜索的匹配记录,第三个是最大指定的建议以及列名“Similarity”,规则是 - 相似度值越高,结果与搜索关键字越接近。

我尝试在 Northwind 数据库上搜索“AANA”,得到了“Ana Trujillo”和“Ann Devon”,非常接近。

用法

以下是使用存储过程的方法

Exec PhonicSearch 'Customers', 'customerid, CompanyName, 
     ContactName, ContactTitle'<script></script> , 'ContactName', 'AANA',5 

以下是存储过程的代码

CREATE PROCEDURE PhonicSearch 
@TableName varchar (80)  -- table name
, @ColumnList varchar(800) -- list of comma seperated column list to return
, @MatchColumn varchar(80) -- compare column with
, @SearchFor varchar(150) -- search string to compare with @MatchColumn
, @MaxSuggest varchar(3) -- in case no exact match found the maximum number 
                         -- of suggested value in @MatchColumn column<script></script> 

AS   

Declare @strSQL varchar(1500)

-- Build and execute SQL query to find exact match 
Set @strSQL = 'SELECT ' + @ColumnList + ' FROM ' + @TableName + 
              ' WHERE ' + @MatchColumn + ' = ''' + @SearchFor + ''''
--Print @strSQL
exec (@strSQL)

-- If no exact match found build query with phonic search 
IF @@ROWCOUNT<script></script> =0 
Begin 
    -- Phonic Search query   
    Set @strSQL = 'SELECT ' + @ColumnList + ' FROM ' + @TableName + 
                  ' WHERE SOUNDEX(' + @MatchColumn + 
                  ') = SOUNDEX(''' + @SearchFor + ''')'

    exec(@strSQL)
    --print @strSQL

    -- Suggetested words for refin search 
    Set @strSQL = 'SELECT TOP ' + @MaxSuggest + ' ' + @MatchColumn + ', DIFFERENCE('+ 
                  @MatchColumn+ ', '''<script></script> + @SearchFor + 
                  ''') as Similarity FROM ' + @TableName + ' WHERE SOUNDEX(' + 
                  @MatchColumn + ') = SOUNDEX(''' + @SearchFor + 
                  ''') ORDER BY Similarity'

    exec(@strSQL)
    --print @strSQL
END

关注点

有关更多信息,请访问 http://www.creativyst.com/Doc/Articles/SoundEx1/SoundEx1.htm

问题:即使当时还没有电话,他们为什么将其命名为“语音搜索”???

历史

还没有!

© . All rights reserved.