PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 附录 F. 额外提供的模块 | 下一页

# F.15. fuzzystrmatch

`fuzzystrmatch`模块提供几个函数判断字符串之间的相似点和距离。

小心
目前，`soundex`, `metaphone`, `dmetaphone`, 和 `dmetaphone_alt`不适合多字节编码（如UTF-8）。

## F.15.1. Soundex

Soundex 系统是一种通过转换为相同代码匹配相似发音名字的方法。 最初是在1880、1900和1910年用于美国的人口普查。注意Soundex对于非英文的名字不是很有帮助。

`fuzzystrmatch`模块提供和Soundex代码一起使用的两个函数:

    soundex(text) returns text
    difference(text, text) returns int

`soundex`函数转换字符串为Soundex代码。`difference` 函数转换两个字符串为它们的Soundex代码然后报告匹配代码位置的数量。 因为Soundex代码有四个字符，结果范围从零到四，零表示没有匹配而四表示完全匹配。 （因此，这个函数取名不当，`similarity`本是一个好名字。）

这里是一些有用的示例：

    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;

## F.15.2. Levenshtein

这个函数计算两个字符串之间的Levenshtein距离：

    levenshtein(text source, text target, int ins_cost, int del_cost, int sub_cost) returns int
    levenshtein(text source, text target) returns int
    levenshtein_less_equal(text source, text target, int ins_cost, int del_cost, int sub_cost, int max_d) returns int
    levenshtein_less_equal(text source, text target, int max_d) returns int

`source`和`target`都可以是任意非空字符串，最多为255字节。 cost参数声明对于一个字符插入、删除或替换分别改变多少。可以省略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)

## F.15.3. Metaphone

Metaphone，类似于Soundex，基于为输入字符串构造一个典型的代码的想法。 如果两个字符串有相同的代码那么认为它们相似。

这个函数计算输入字符串的metaphone代码：

    metaphone(text source, int max_output_length) returns text

`source`必须为一个非空字符串，最多为255个字符。 `max_output_length`设置输出metaphone代码的最大长度； 如果实际比这长，那么输出截断为这个长度。

示例：

    test=# SELECT metaphone('GUMBO', 4);
     metaphone
    -----------
     KM
    (1 row)

## F.15.4. Double Metaphone

Double Metaphone系统为一个给定的输入字符串计算两个"听起来像"的字符串— 一个"原先的"和一个"替换的"。大多数情况下它们相同， 但是取决于发音它们对于非英文名有一点不同。这些函数计算原先的和替换的代码：

    dmetaphone(text source) returns text
    dmetaphone_alt(text source) returns text

这里对于输入字符串没有长度限制。

示例：

    test=# select dmetaphone('gumbo');
     dmetaphone
    ------------
     KMP
    (1 row)

上一页 | 起始页 | 下一页
file_fdw | 上一级 | hstore