版本:
目录导航

F.17. fuzzystrmatch

fuzzystrmatch模块提供多个函数来确定字符串之间的相似性和距离。

小心

当前,soundexmetaphonedmetaphonedmetaphone_alt函数使用多字节编码(例如 UTF-8)下工作得不好。

这个模块被视为trusted,就是说,它可由在当前数据库上拥有CREATE特权的非超级用户安装。

F.17.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.17.2. Levenshtein

该函数计算两个字符串之间的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

sourcetarget都可以是任何非空字符串, 最长为 255 个字符。代价参数分别指定一个字符插入、删除或替换的开销。 你可以像这个函数的第二种版本那样忽略代价参数,那样它们都会默认为 1。

levenshtein_less_equal是 Levenshtein 函数的加速版本, 用于只对小距离感兴趣的情况。如果实际距离小于等于max_d, 那么levenshtein_less_equal返回正确的距离;否则它返回某个 大于max_d的值。如果max_d是负值,那么其行为等同于 levenshtein

示例:

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.17.3. Metaphone

Metaphone, 和 Soundex 相似,基于为输入字符串构建代表性代码的思想。 如果两个字符串具有相同的代码,则认为它们相似。

这个函数计算一个输入字符串的变音位代码:

metaphone(text source, int max_output_length) 返回 text

source必须是一个非空字符串,最大长度为255个字符。max_output_length设置输出的变音位代码的最大长度,如果超长,输出会被截断到这个长度。

例子:

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

F.17.4. 双变音位

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

dmetaphone(text source) 返回 text
dmetaphone_alt(text source) 返回 text

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

例子:

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