Greenplum的模糊字符串匹配扩展

    Greenplum安装包括了该扩展模块中包含请求功能(函数)的文件,用来在数据库中定义扩展函数和移除函数的SQL脚本。

    警告:soundex、metaphone、 dmetaphone以及dmetaphone_alt函数在多字节编码环境(例如,UTF-8)下不能很好的工作。

    Greenplum模糊字符串匹配扩展是基于PostgreSQL模糊匹配模块的。

    上级主题:

    语音表示法系统是一种将相似发音的名字转换成相同的代码来匹配它们的方法。

    注释: 语音表示法对英语名称最有效果。

    下面的函数用于语音表示法代码:

    difference函数将两个字符串转换成它们的语音表示法代码并且接着报告能匹配代码位置的数量。由于语音表示法代码具有四个字符,结果可以从零到四,零表示没有匹配而四表示完全匹配。下面是一些例子:

    1. SELECT soundex('Anne'), soundex('Ann'), difference('Anne', 'Ann');
    2. SELECT soundex('Anne'), soundex('Andrew'), difference('Anne', 'Andrew');
    3. CREATE TABLE s (nm text);
    4. INSERT INTO s VALUES ('john');
    5. INSERT INTO s VALUES ('joan');
    6. INSERT INTO s VALUES ('wobbly');
    7. SELECT * FROM s WHERE soundex(nm) = soundex('john');
    8. SELECT * FROM s WHERE difference(s.nm, 'john') > 2;

    更多关于语音表示索引系统的信息见 https://www.archives.gov/research/census/soundex.html.

    这些函数计算两个字符串之间的编辑距离:

    1. levenshtein(text source, text target, int ins_cost, int del_cost, int sub_cost) 返回 int
    2. levenshtein(text source, text target) 返回 int
    3. 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的值。示例:

    更多关于Levenshtein算法信息见 .

    和 Soundex 相似,Metaphone 的思想是构建一个输入字符串的一种代码。如果两个字符串具有相同的代码则认为它们相似。这个函数计算一个输入字符串的变音位代码:

    1. metaphone(text source, int max_output_length) 返回 text
    1. metaphone
    2. -----------
    3. KM
    4. (1 row)

    更多关于Metaphone算法的信息见 https://en.wikipedia.org/wiki/Metaphone.

    双变音位系统为一个给定输入字符串计算两个”听起来像的”字符串 — 一个”主要”代码和一个”次要”代码。在大部分情况下它们是相同的,但是对于非英语名称它们可能有一点不同,这取决于发音。这些函数计算主要和次要代码:

    对输入字符串没有长度限制。示例:

    1. test=# select dmetaphone('gumbo');
    2. dmetaphone
    3. ------------
    4. KMP
    5. (1 row)

    更多关于Double Metaphone算法信息见.

    Greenplum提供SQL脚本来安装和卸载模糊字符串匹配扩展函数。

    执行下面的SQL脚本在数据库中安装函数:

    执行下面的SQL脚本卸载函数: