RDS PostgreSQL支援fuzzystrmatch外掛程式,提供Soundex、Levenshtein、Metaphone和Double Metaphone四種功能,能夠用來判斷字串之間的相似性和距離。
外掛程式開啟與關閉
- 開啟外掛程式。
CREATE EXTENSION fuzzystrmatch;
- 關閉外掛程式。
DROP EXTENSION fuzzystrmatch;
Soundex
Soundex功能可以將相似發音的名字轉換成相同的代碼並進行匹配,但是Soundex對於非英語名稱效果較差。
Soundex功能提供如下函數:
soundex(text) returns text
difference(text, text) returns int
- soundex函數將一個字串轉換成它的Soundex代碼(例如A550)。
- difference函數將兩個字串轉換成它們的Soundex代碼並報告兩個代碼匹配位置的數量。由於Soundex代碼具有四個字元,代碼匹配位置數量的取值範圍是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功能可以計算兩個字串之間的編輯距離(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 | 第一個字串,任意非Null 字元串, 最長支援255個字元。 |
target | 第二個字串,任意非Null 字元串, 最長支援255個字元。 |
ins_cost | 字元插入的開銷。 |
del_cost | 字元刪除的開銷。 |
sub_cost | 字元替換的開銷。 |
max_d | 最大Levenshtein距離。 |
說明 levenshtein_less_equal函數是Levenshtein函數的加速版本,在只計算小距離時使用:
- 如果實際的距離低於或等於max_d,levenshtein_less_equal返回精確值。
- 如果實際的距離大於max_d,levenshtein_less_equal返回大於max_d的值。
- 如果max_d為負值,levenshtein_less_equal函數和levenshtein函數相同。
用法樣本如下:
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功能相同,構建一個輸入字串的表示代碼,如果兩個字串具有相同的代碼則認為它們相似。
Metaphone功能提供如下函數:
metaphone(text source, int max_output_length) returns text
參數說明如下。
參數 | 說明 |
source | 任意非Null 字元串, 最長支援255個字元。 |
max_output_length | 設定輸出的metaphone代碼的最大長度,如果超長,輸出會被截斷到這個長度。 |
用法樣本如下:
SELECT metaphone('GUMBO', 4);
Double Metaphone
Double Metaphone功能能夠為一個輸入的字串計算出兩個相似的字串,包括一個主要函數和一個次要函數。在大部分情況下它們是相同的,但是對於非英語名稱它們可能有一點不同(取決於發音)。
Double Metaphone功能提供的主要和次要函數如下:
dmetaphone(text source) returns text
dmetaphone_alt(text source) returns text
用法樣本如下:
select dmetaphone('gumbo');
select dmetaphone_alt('gumbo');