PostgreSQL fuzzystrmatch

2021-09-16 15:43 更新
F.15.1. Soundex
F.15.2. Levenshtein
F.15.3. Metaphone
F.15.4. 雙 Metaphone

fuzzystrmatch模塊提供多個函數(shù)來判斷字符串之間的相似性和距離。

小心

當前,soundexmetaphone、dmetaphonedmetaphone_alt函數(shù)使用多字節(jié)編碼(例如 UTF-8)下工作得不好。

這個模塊被視為trusted,就是說,它可由在當前數(shù)據(jù)庫上擁有CREATE特權(quán)的非超級用戶安裝。

F.15.1. Soundex

語音表示法系統(tǒng)是一種將相似發(fā)音的名字轉(zhuǎn)換成相同的代碼來匹配它們的方法。這最初由美國國家統(tǒng)計局在 1880 年、1900 年和 1910 年使用。注意語音表示法對于非英語名稱不是很有用。

fuzzystrmatch模塊提供了兩個函數(shù)用于語音表示法代碼:

soundex(text) 返回 text
difference(text, text) 返回 int

soundex函數(shù)將一個字符串轉(zhuǎn)換成它的語音表示法代碼。difference函數(shù)將兩個字符串轉(zhuǎn)換成它們的語音表示法代碼并且接著報告能匹配代碼位置的數(shù)量。由于語音表示法代碼具有四個字符,結(jié)果可以從零到四,零表示沒有匹配而四表示完全匹配(因此這個函數(shù)的命名并不適當 — 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.15.2. Levenshtein

這個函數(shù)計算兩個字符串之間的編輯距離。

levenshtein(text source, text target, int ins_cost, int del_cost, int sub_cost) 返回 int
levenshtein(text source, text target) 返回 int
levenshtein_less_equal(text source, text target, int ins_cost, int del_cost, int sub_cost, int max_d) 返回 int
levenshtein_less_equal(text source, text target, int max_d) 返回 int

source以及target都可以是任何非空字符串, 最長為 255 個字符。代價參數(shù)分別指定一個字符插入、刪除或替換的開銷。 你可以像這個函數(shù)的第二種版本那樣忽略代價參數(shù),那樣它們都會默認為 1。

levenshtein_less_equal是 Levenshtein 函數(shù)的速度更快 的版本,它被用于只對小距離感興趣的情況。如果實際距離小于等于max_d, 那么levenshtein_less_equal返回正確的距離。否則它返回某個 大于max_d的值。如果 max_d是負值,那么其行為等同于 levenshtein

例子:

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

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

test=# SELECT levenshtein_less_equal('extensive', 'exhaustive',2);
 levenshtein_less_equal
------------------------
                      3
(1 row)

test=# SELECT levenshtein_less_equal('extensive', 'exhaustive',4);
 levenshtein_less_equal
------------------------
                      4
(1 row)

F.15.3. Metaphone

和 Soundex 相似,Metaphone 的思想是構(gòu)建一個輸入字符串的一種代碼。如果兩個字符串具有相同的代碼則認為它們相似。

這個函數(shù)計算一個輸入字符串的變音位代碼:

metaphone(text source, int max_output_length) 返回 text

source必須是一個非空字符串,最大長度為 255 個字符。max_output_length設(shè)置輸出的變音位代碼的最大長度,如果超長,輸出會被截斷到這個長度。

例子:

test=# SELECT metaphone('GUMBO', 4);
 metaphone
-----------
 KM
(1 row)

F.15.4. 雙 Metaphone

雙變音位系統(tǒng)為一個給定輸入字符串計算兩個聽起來像的字符串 — 一個主要代碼和一個次要代碼。在大部分情況下它們是相同的,但是對于非英語名稱它們可能有一點不同,這取決于發(fā)音。這些函數(shù)計算主要和次要代碼:

dmetaphone(text source) 返回 text
dmetaphone_alt(text source) 返回 text

對輸入字符串沒有長度限制。

例子:

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


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號