[CodeProject每日一荐]实现Double Metaphone语音匹配算法[三,四] VBScript调用COM;存储过程实现及高级话题
Implement Phonetic ("Sounds-like") Name Searches with Double Metaphone Part III: VBScript and ASP & Database Solutions By Adam Nelson
[三] 就一笔带过了:因为VB只是类型化的变量,而脚本语言是无类型的.所以COM必须为脚本语言单独实现一个版本,然后在脚本语言VBcript,JScript,以及ASP里面的VBcript就可以调用了.
Implement Phonetic ("Sounds-like") Name Searches with Double Metaphone Part IV: SQL Server and Advanced Database Topics By Adam Nelson
[四] 还蛮有意思的.作为数据库开发人员出身的作者(作者语),推介了存储过程的种种好处,并展示了用Sql Server的使用技巧.
[使用存储过程]
SQL Server的扩展存储过程是用 Win32 DLL的. 安装只需把DLL复制到SQL Server 安装目录的Binn 的目录下,然后在master数据库运行
exec sp_addextendedproc ‘xp_metaphone’, ‘XPMetaphone.dll’
存储过程只做了采用unsigned short 的优化版本.预先把key都算出来存起来,就可以使用select语句来查询了.
[创建集簇索引]
一个表只能创建一个集簇索引列,让物理存储上按该列排序,在数据规模很大时肯定要使用的.如果是把语音key和应用程序其他信息存在一张表里,key往往没有重要到建集簇索引的份.
[减少与现有程序数据表的耦合]
把语音key单独存个表,至少就可以有个集簇索引列了,这种建立数据库的方法减少耦合,当然是好的.
[用触发器更新key]
算法可能会变,新词来了也需要插入key.使用更新和插入时的触发器来维护单词的相应key
[在select里给匹配打分]
(译者:这种case平时我都忽略了,久了不用简直都遗忘了)
select
word,
(
case
when key1 = @primaryKey then
1--Strong match

when key2 = @primaryKey then
2--Normal match

when key1 = @alternateKey then
2--Normal match

when key2 = @alternateKey then
3--Minimal match

else
4--No match
end
) as matchScore
from Words
where
key1 = @primaryKey
or
key2 = @primaryKey
or
key1 = @alternateKey
or
key2 = @alternateKey
order by word
go
[把搜索逻辑也封装在存储过程中]
这下彻底了,应用程序只需简单调用一条存储过程,不用再拼sql语句什么的了,代码重用又一招.
[三] 就一笔带过了:因为VB只是类型化的变量,而脚本语言是无类型的.所以COM必须为脚本语言单独实现一个版本,然后在脚本语言VBcript,JScript,以及ASP里面的VBcript就可以调用了.
Implement Phonetic ("Sounds-like") Name Searches with Double Metaphone Part IV: SQL Server and Advanced Database Topics By Adam Nelson
[四] 还蛮有意思的.作为数据库开发人员出身的作者(作者语),推介了存储过程的种种好处,并展示了用Sql Server的使用技巧.
[使用存储过程]
SQL Server的扩展存储过程是用 Win32 DLL的. 安装只需把DLL复制到SQL Server 安装目录的Binn 的目录下,然后在master数据库运行
sp_addextendedproc,如
use masterexec sp_addextendedproc ‘xp_metaphone’, ‘XPMetaphone.dll’
存储过程只做了采用unsigned short 的优化版本.预先把key都算出来存起来,就可以使用select语句来查询了.
[创建集簇索引]
一个表只能创建一个集簇索引列,让物理存储上按该列排序,在数据规模很大时肯定要使用的.如果是把语音key和应用程序其他信息存在一张表里,key往往没有重要到建集簇索引的份.
[减少与现有程序数据表的耦合]
把语音key单独存个表,至少就可以有个集簇索引列了,这种建立数据库的方法减少耦合,当然是好的.
[用触发器更新key]
算法可能会变,新词来了也需要插入key.使用更新和插入时的触发器来维护单词的相应key
[在select里给匹配打分]
(译者:这种case平时我都忽略了,久了不用简直都遗忘了)
select
word,
(
case
when key1 = @primaryKey then
1--Strong match
when key2 = @primaryKey then
2--Normal match
when key1 = @alternateKey then
2--Normal match
when key2 = @alternateKey then
3--Minimal match
else
4--No match
end
) as matchScore
from Words
where
key1 = @primaryKey
or
key2 = @primaryKey
or
key1 = @alternateKey
or
key2 = @alternateKey
order by word
go[把搜索逻辑也封装在存储过程中]
这下彻底了,应用程序只需简单调用一条存储过程,不用再拼sql语句什么的了,代码重用又一招.
浙公网安备 33010602011771号