Fuzzystrmatch
From PostgreSQL 中文维基, PostgreSQL 中文站, PostgreSQL 中国社区, PostgreSQL Chinese community
目录 |
[编辑] fuzzystrmatch
fuzzystrmatch 提供了几个函数用于判断字串之间的相似性和距离。
[编辑] 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;
[编辑] Levenshtein
这个函数计算两个字串之间的 Levenshtein 距离:
levenshtein(text source, text target) returns int
源和目标都可以是任意非空字串,最多 255 个字符
例子:
test=# SELECT levenshtein('GUMBO', 'GAMBOL');
levenshtein
-------------
2
(1 row)
[编辑] Metaphone
Metaphone 和 Soundex 类似,是基于用输入字串构造一个编码来代表的方法。如果两个字串有相同的编码,则认为它们是类似的。
这个函数给输入字串计算一个 metaphone 代码:
metaphone(text source, int max_output_length) returns text
源必须是一个非空的字串,最大长度是 255 字符。max_output_length 设置输出的 metaphone 编码的最大长度;如果更长,那么输出则截断为这个长度。
例子:
test=# SELECT metaphone('GUMBO', 4);
metaphone
-----------
KM
(1 row)
[编辑] Double Metaphone
Double Metaphone 系统为一个输入字串 -- 一个“主字串”和一个“变更字串”计算两个“听上去相似”的字串。大多数场合下它们是相同的,但是在非英语名字里可能会相当不同,具体取决于发音。这些函数计算主编码和变更编码:
dmetaphone(text source) returns text dmetaphone_alt(text source) returns text
输入字串没有长度限制。
例子:
test=# select dmetaphone('gumbo');
dmetaphone
------------
KMP
(1 row)
