F.16. fuzzystrmatch #
fuzzystrmatch 模块提供多个函数,用于确定字符串的相似性和距离。
小心
目前,soundex、metaphone、dmetaphone 和 dmetaphone_alt 函数不能很好地处理多字节编码(例如 UTF-8)。
F.16.1. Soundex
Soundex 系统是一种通过将发音相近的名字转换为相同代码来进行匹配的方法。它最初在 1880 年、1900 年和 1910 年的美国人口普查中使用。注意,Soundex 对非英语名字并不是很有用。
fuzzystrmatch 模块提供两个用于处理 Soundex 代码的函数:
soundex(text) returns text difference(text, text) returns int
soundex 函数将字符串转换为其 Soundex 代码。difference 函数将两个字符串转换为各自的 Soundex 代码,然后返回代码中相同位置上匹配的个数。由于 Soundex 代码有四个字符,因此结果范围为 0 到 4,其中 0 表示没有匹配,4 表示完全匹配。(因此,这个函数的命名并不贴切,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.16.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 都可以是任意非 NULL 字符串,最大长度为 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.16.3. Metaphone
Metaphone 与 Soundex 一样,基于为输入字符串构造一个代表性代码的思想。如果两个字符串具有相同的代码,则认为它们相似。
该函数计算输入字符串的 Metaphone 代码:
metaphone(text source, int max_output_length) returns text
source 必须是非 NULL 字符串,最大长度为 255 个字符。max_output_length 设置输出 Metaphone 代码的最大长度;如果超过该长度,输出会被截断为该长度。
示例:
test=# SELECT metaphone('GUMBO', 4);
metaphone
-----------
KM
(1 row)F.16.4. Double Metaphone
Double Metaphone 系统会为给定输入字符串计算两个“近音”代码,即一个“主”代码和一个“备选”代码。在大多数情况下,它们相同,但尤其对于非英语名字,这两个代码可能会因发音不同而略有差异。这些函数分别计算主代码和备选代码:
dmetaphone(text source) returns text dmetaphone_alt(text source) returns text
输入字符串没有长度限制。
示例:
test=# select dmetaphone('gumbo');
dmetaphone
------------
KMP
(1 row)