F.15. fuzzystrmatch

fuzzystrmatch模块提供了几个功能来确定字符串之间的相似性和距离。

Caution

目前,soundexmetaphonedmetaphonedmetaphone_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

sourcetarget都可以是任何非空字符串,最多 255 个字符。费用参数分别指定对字符插入,删除或替换收取多少费用。您可以省略成本参数,如该函数的第二个版本中所示。在这种情况下,它们都默认为 1.

levenshtein_less_equal是 Levenshtein 函数的加速版本,仅在需要较小距离的情况下使用。如果实际距离小于或等于max_d,则levenshtein_less_equal返回正确的距离;否则返回大于max_d的值。如果max_d为负,则行为与levenshtein相同。

Examples:

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

像 Soundex 一样,Metaphone 也基于为 Importing 字符串构造代表代码的思想。如果两个字符串具有相同的代码,则认为它们相似。

此函数计算 Importing 字符串的元音代码:

metaphone(text source, int max_output_length) returns text

source必须是非空字符串,最多 255 个字符。 max_output_length设置输出中继电话代码的最大长度;如果更长,则输出将被截断为此长度。

Example:

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

F.15.4. 双音位

Double Metaphone 系统针对给定的 Importing 字符串计算两个“类似”的字符串-“主”字符串和“备用”字符串。在大多数情况下,它们是相同的,但对于非英语名称,尤其是它们,可能会有所不同,具体取决于发音。这些函数计算主代码和备用代码:

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

Importing 字符串没有长度限制。

Example:

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