Greenplum的模糊字符串匹配扩展
Greenplum的模糊字符串匹配扩展
Greenplum模糊字符串匹配扩展提供了各种各样的计算两个字符串相似性和距离的算法的实现函数。
Greenplum安装包括了该扩展模块中包含请求功能(函数)的文件,用来在数据库中定义扩展函数和移除函数的SQL脚本。
Greenplum模糊字符串匹配扩展是基于PostgreSQL模糊匹配模块的。
Soundex函数
语音表示法系统是一种将相似发音的名字转换成相同的代码来匹配它们的方法。
下面的函数用于语音表示法代码:
soundex(text string1) 返回 text difference(text string1, text string2) 返回 int
soundex函数将一个字符串转换成它的语音表示法代码。语音表示法包括了四个字符。
difference函数将两个字符串转换成它们的语音表示法代码并且接着报告能匹配代码位置的数量。由于语音表示法代码具有四个字符,结果可以从零到四,零表示没有匹配而四表示完全匹配。下面是一些例子:
SELECT soundex('hello world!'); SELECT soundex('Anne'), soundex('Ann'), difference('Anne', 'Ann'); SELECT soundex('Anne'), soundex('Andrew'), difference('Anne', 'Andrew'); SELECT soundex('Anne'), soundex('Margaret'), difference('Anne', 'Margaret'); CREATE TABLE s (nm text); INSERT INTO s VALUES ('john'); INSERT INTO s VALUES ('joan'); INSERT INTO s VALUES ('wobbly'); INSERT INTO s VALUES ('jack'); SELECT * FROM s WHERE soundex(nm) = soundex('john'); SELECT * FROM s WHERE difference(s.nm, 'john') > 2;
更多关于语音表示索引系统的信息见 https://www.archives.gov/research/census/soundex.html.
Levenshtein 函数
这些函数计算两个字符串之间的编辑距离:
levenshtein(text source, text target, int ins_cost, int del_cost, int sub_cost) 返回 int levenshtein(text source, text target) 返回 int levenshtein_less_equal(text source, text target, int ins_cost, int del_cost, int sub_cost, int max_d) 返回 int levenshtein_less_equal(text source, text target, int max_d) 返回 int
source以及 target都可以是任何非空字符串, 最长为 255 个字符。代价参数ins_cost、del_cost以及sub_cost分别指定一个字符插入、删除或替换的开销。 用户可以像这个函数的第二种版本那样忽略代价参数,那样它们都会默认为 1
levenshtein_less_equal是 levenshtein 函数的速度更快的版本,它被用于只对小距离感兴趣的情况。如果实际距离小于等于max_d, 那么levenshtein_less_equal返回正确的距离。否则它返回某个大于max_d的值。示例:
test=# SELECT levenshtein('GUMBO', 'GAMBOL'); levenshtein ------------- 2 (1 row) test=# SELECT levenshtein('GUMBO', 'GAMBOL', 2,1,1); levenshtein ------------- 3 (1 row) test=# SELECT levenshtein_less_equal('extensive', 'exhaustive',2); levenshtein_less_equal ------------------------ 3 (1 row) test=# SELECT levenshtein_less_equal('extensive', 'exhaustive',4); levenshtein_less_equal ------------------------ 4 (1 row)
更多关于Levenshtein算法信息见 http://www.levenshtein.net/.
Metaphone 函数
metaphone(text source, int max_output_length) 返回 text
source必须是一个非空字符串,最大长度为 255 个字符。max_output_length设置输出的变音位代码的最大长度,如果超长,输出会被截断到这个长度。示例:
test=# SELECT metaphone('GUMBO', 4); metaphone ----------- KM (1 row)
更多关于Metaphone算法的信息见 https://en.wikipedia.org/wiki/Metaphone.
Double Metaphone 函数
dmetaphone(text source) 返回 text dmetaphone_alt(text source) 返回 text对输入字符串没有长度限制。示例:
test=# select dmetaphone('gumbo'); dmetaphone ------------ KMP (1 row)
更多关于Double Metaphone算法信息见https://en.wikipedia.org/wiki/Metaphone#Double_Metaphone.
安装和卸载模糊字符串匹配函数
Greenplum提供SQL脚本来安装和卸载模糊字符串匹配扩展函数。
执行下面的SQL脚本在数据库中安装函数:
psql -f $GPHOME/share/postgresql/contrib/fuzzystrmatch.sql
执行下面的SQL脚本卸载函数:
psql -f $GPHOME/share/postgresql/contrib/uninstall_fuzzystrmatch.sql