ApsaraDB RDS for PostgreSQL は fuzzystrmatch 拡張機能を提供します。この拡張機能は、Soundex、Levenshtein、Metaphone、Double Metaphone の各アルゴリズムをサポートします。これらのアルゴリズムを使用して、文字列間の類似性と距離を計算できます。
fuzzystrmatch 拡張機能の有効化と無効化
-
拡張機能を有効化します。
CREATE EXTENSION fuzzystrmatch; -
拡張機能を無効化します。
DROP EXTENSION fuzzystrmatch;
Soundex
Soundex アルゴリズムは、発音が似ている単語を同一のコードに変換します。ただし、このアルゴリズムは英語以外の単語には適していません。
Soundex アルゴリズムは、次の関数を提供します:
soundex(text) returns text
difference(text, text) returns int
-
soundex関数は、文字列を Soundex コード (例:A550) に変換します。 -
difference関数は、2 つの文字列をそれぞれ Soundex コードに変換し、コードが一致する位置の数を返します。Soundex コードは 4 文字であるため、結果は 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 アルゴリズムは、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
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
次の表で、これらの関数で使用するパラメーターについて説明します。
|
パラメーター |
説明 |
|
ソース |
1 つ目の文字列。空にすることはできず、最大 255 文字です。 |
|
ターゲット |
2 つ目の文字列。空にすることはできず、最大 255 文字です。 |
|
ins_cost |
文字の挿入コストです。 |
|
del_cost |
文字の削除コストです。 |
|
sub_cost |
文字の置換コストです。 |
|
max_d |
Levenshtein 距離の最大値です。 |
levenshtein_less_equal 関数は levenshtein 関数の最適化版であり、距離が小さいかどうかを確認する場合に有用です:
-
実際の距離が
max_d以下の場合、関数は正確な距離を返します。 -
実際の距離が
max_dより大きい場合、関数は max_d より大きい値を返します。 -
max_dが負の場合、関数は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);
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)
Metaphone
Metaphone アルゴリズムは Soundex アルゴリズムと同様に動作します。Metaphone アルゴリズムは、指定した各文字列に対して代表コードを生成します。2 つの文字列の代表コードが同じ場合、Metaphone アルゴリズムはそれらを類似していると見なします。
Metaphone アルゴリズムは、次の関数を提供します:
metaphone(text source, int max_output_length) returns text
次の表で、この関数で使用するパラメーターについて説明します。
|
パラメーター |
説明 |
|
ソース |
ソース文字列。空にすることはできず、最大 255 文字です。 |
|
max_output_length |
出力される Metaphone コードの最大長。これより長いコードは切り捨てられます。 |
例:
SELECT metaphone('GUMBO', 4);
Double Metaphone
Double Metaphone アルゴリズムは、指定した文字列に対して発音が似ている 2 つのコードを取得します。これらのコードには、主コードと副コードが含まれます。ほとんどの場合、2 つのコードは同一です。英語以外の単語の場合、2 つのコードがわずかに異なることがあります。差異は発音に応じて変化します。
Double Metaphone アルゴリズムは、次の関数を提供します:
dmetaphone(text source) returns text
dmetaphone_alt(text source) returns text
例:
select dmetaphone('gumbo');
select dmetaphone_alt('gumbo');