fuzzystrmatch
モジュールは、文字列間の類似度や相違度を決める複数の関数を提供します。
現時点で、soundex
、metaphone
、dmetaphone
、dmetaphone_alt
は(UTF-8のような)マルチバイト符号化方式では充分に動作しません。
Soundexシステムは、同一コードに変換することで似ているように見える名称を一致させる手法です。 これは、1880年、1900年、1910年の米国国勢調査で初めて使用されました。 Soundexは非英語圏の名称では特に有用なものではないことに注意してください。
fuzzystrmatch
はSoundexコードを使用して動作する2つの関数を提供します。
soundex(text) returns text difference(text, text) returns int
soundex
関数は文字列をSoundexコードに変換します。
difference
関数は2つの文字列をそのSoundexコードに変換し、コード位置が一致する個数を報告します。
Soundexコードは4文字からなりますので、結果は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;
この関数は2つの文字列間のレーベンシュタイン距離を計算します。
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
およびtarget
は255文字までの任意の非NULL文字列を取ることができます。
コストパラメータはそれぞれ、文字の挿入、削除、置換に負わせる文字数を指定します。
この関数の2番目のバージョンのようにコストパラメータを省略することができます。
この場合デフォルトですべて1になります。
levenshtein_less_equal
は小さな距離だけを問題にする場合についてのlevenshtein関数の高速化版です。
実際の距離が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)
Metaphoneは、Soundex同様、入力文字に対する対応するコードを構築するという考えに基づいたものです。 2つの文字列が同一コードを持つ場合、類似とみなされます。
以下の関数は入力文字列に対するmetaphoneコードを計算します。
metaphone(text source, int max_output_length) returns text
source
は255文字までの非NULL文字列を取ることができます。
max_output_length
は出力metaphoneコードの最大長を設定します。
出力は長すぎるとこの長さに切り詰められます。
以下に例を示します。
test=# SELECT metaphone('GUMBO', 4); metaphone ----------- KM (1 row)
Double Metaphoneシステムは与えられた入力文字列に対する、「primary」と「alternate」という2つの「似たように見える」文字列を計算します。 ほとんどの場合、これらは同じですが、英語以外の名称では特に発音に応じて多少異なる場合があります。 以下の関数はprimaryコードとalternateコードを計算します。
dmetaphone(text source) returns text dmetaphone_alt(text source) returns text
入力文字列長に関する制限はありません。
以下に例を示します。
test=# SELECT dmetaphone('gumbo'); dmetaphone ------------ KMP (1 row)