选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.0 已于 2015 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

F.12. fuzzystrmatch — 确定字符串的相似性和距离 #

fuzzystrmatch模块提供多个函数,用于确定字符串的相似性和距离。

小心

目前,fuzzystrmatch 不能很好地处理多字节编码 (例如 UTF-8)。

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

sourcetarget 可以是任何 非空字符串,最大长度为 255 字节。代价参数分别指定字符插入、删除 或替换的代价。可以像该函数的第二种形式那样省略代价参数;此时 它们都默认为 1。

示例:

test=# SELECT levenshtein('GUMBO', 'GAMBOL');
 levenshtein
-------------
           2
(1 row)

test=# SELECT levenshtein('GUMBO', 'GAMBOL', 2,1,1);
 levenshtein
-------------
           3
(1 row)

F.12.3. Metaphone

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

该函数计算输入字符串的 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.12.4. Double Metaphone

Double Metaphone 系统会为给定输入字符串计算两个近音代码, 即一个代码和一个备选代码。在大多数情况下, 它们相同,但尤其对于非英语名字,这两个代码可能会因发音不同而略有差异。 这些函数分别计算主代码和备选代码:

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

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

示例:

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

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。