9.3 9.4 9.5 9.6 10 11 12
阿里云PostgreSQL 问题报告 纠错本页面

F.14. fuzzystrmatch

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

小心

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

F.14.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.14.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

sourcetarget都可以是任意非空字符串, 最长为 255 字符。cost参数分别指定一个字符插入、删除或替换的开销。 你可以像该函数的第二种语法那样忽略cost参数,那样它们都会默认为 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.14.3. Metaphone

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

这个函数计算一个输入字符串的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.14.4. Double Metaphone

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

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

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

例子:

test=# select dmetaphone('gumbo');
 dmetaphone
------------
 KMP
(1 row)
<
/BODY >