字符串相似性判斷(fuzzystrmatch)
RDS PostgreSQL支持fuzzystrmatch插件,提供Soundex、Levenshtein、Metaphone和Double Metaphone四種功能,能夠用來判斷字符串之間的相似性和距離。
您可以加入RDS PostgreSQL插件交流釘釘群(103525002795),進(jìn)行咨詢、交流和反饋,獲取更多關(guān)于插件的信息。
插件開啟與關(guān)閉
開啟插件。
CREATE EXTENSION fuzzystrmatch;
關(guān)閉插件。
DROP EXTENSION fuzzystrmatch;
Soundex
Soundex功能可以將相似發(fā)音的名字轉(zhuǎn)換成相同的代碼并進(jìn)行匹配,但是Soundex對(duì)于非英語名稱效果較差。
Soundex功能提供如下函數(shù):
soundex(text) returns text
difference(text, text) returns int
soundex函數(shù)將一個(gè)字符串轉(zhuǎn)換成它的Soundex代碼(例如A550)。
difference函數(shù)將兩個(gè)字符串轉(zhuǎn)換成它們的Soundex代碼并報(bào)告兩個(gè)代碼匹配位置的數(shù)量。由于Soundex代碼具有四個(gè)字符,代碼匹配位置數(shù)量的取值范圍是0~4,0表示沒有匹配,4表示完全匹配。
用法示例如下:
SELECT soundex('hello world!');
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功能可以計(jì)算兩個(gè)字符串之間的編輯距離(Levenshtein距離)。
Levenshtein功能提供如下函數(shù):
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
參數(shù)說明如下。
參數(shù) | 說明 |
source | 第一個(gè)字符串,任意非空字符串, 最長支持255個(gè)字符。 |
target | 第二個(gè)字符串,任意非空字符串, 最長支持255個(gè)字符。 |
ins_cost | 字符插入的開銷。 |
del_cost | 字符刪除的開銷。 |
sub_cost | 字符替換的開銷。 |
max_d | 最大Levenshtein距離。 |
levenshtein_less_equal函數(shù)是Levenshtein函數(shù)的加速版本,在只計(jì)算小距離時(shí)使用:
如果實(shí)際的距離低于或等于max_d,levenshtein_less_equal返回精確值。
如果實(shí)際的距離大于max_d,levenshtein_less_equal返回大于max_d的值。
如果max_d為負(fù)值,levenshtein_less_equal函數(shù)和levenshtein函數(shù)相同。
用法示例如下:
SELECT levenshtein('GUMBO', 'GAMBOL');
SELECT levenshtein('GUMBO', 'GAMBOL', 2,1,1);
SELECT levenshtein_less_equal('extensive', 'exhaustive',2);
SELECT levenshtein_less_equal('extensive', 'exhaustive',4);
Metaphone
Metaphone功能的思想和Soundex功能相同,構(gòu)建一個(gè)輸入字符串的表示代碼,如果兩個(gè)字符串具有相同的代碼則認(rèn)為它們相似。
Metaphone功能提供如下函數(shù):
metaphone(text source, int max_output_length) returns text
參數(shù)說明如下。
參數(shù) | 說明 |
source | 任意非空字符串, 最長支持255個(gè)字符。 |
max_output_length | 設(shè)置輸出的metaphone代碼的最大長度,如果超長,輸出會(huì)被截?cái)嗟竭@個(gè)長度。 |
用法示例如下:
SELECT metaphone('GUMBO', 4);
Double Metaphone
Double Metaphone功能能夠?yàn)橐粋€(gè)輸入的字符串計(jì)算出兩個(gè)相似的字符串,包括一個(gè)主要函數(shù)和一個(gè)次要函數(shù)。在大部分情況下它們是相同的,但是對(duì)于非英語名稱它們可能有一點(diǎn)不同(取決于發(fā)音)。
Double Metaphone功能提供的主要和次要函數(shù)如下:
dmetaphone(text source) returns text
dmetaphone_alt(text source) returns text
用法示例如下:
select dmetaphone('gumbo');
select dmetaphone_alt('gumbo');