Fuzzystrmatch

From PostgreSQL 中文维基, PostgreSQL 中文站, PostgreSQL 中国社区, PostgreSQL Chinese community

Jump to: navigation, search

目录

[编辑] 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)
Personal tools