F.20. fuzzystrmatch
ÐодÑÐ»Ñ fuzzystrmatch ÑодеÑÐ¶Ð¸Ñ Ð½ÐµÑколÑко ÑÑнкÑий Ð´Ð»Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ ÑÑ
ожеÑÑи и ÑаÑÑÑоÑÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ ÑÑÑоками.
Ðнимание
РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÑÑнкÑии soundex, metaphone, dmetaphone и dmetaphone_alt плоÑ
о ÑабоÑаÑÑ Ñ Ð¼Ð½Ð¾Ð³Ð¾Ð±Ð°Ð¹ÑнÑми кодиÑовками (в ÑаÑÑноÑÑи, Ñ UTF-8).
ÐаннÑй модÑÐ»Ñ ÑÑиÑаеÑÑÑ Â«Ð´Ð¾Ð²ÐµÑеннÑм», Ñо еÑÑÑ ÐµÐ³Ð¾ могÑÑ ÑÑÑанавливаÑÑ Ð¾Ð±ÑÑнÑе полÑзоваÑели, имеÑÑие пÑаво CREATE в ÑекÑÑей базе даннÑÑ
.
F.20.1. Soundex
СиÑÑема Soundex позволÑÐµÑ Ð²ÑÑиÑлиÑÑ Ð¿Ð¾Ñ Ð¾Ð¶Ð¸Ðµ по звÑÑÐ°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð°, пÑÐ¸Ð²Ð¾Ð´Ñ Ð¸Ñ Ðº одинаковÑм кодам. ÐзнаÑалÑно она иÑполÑзовалаÑÑ Ð´Ð»Ñ Ð¾Ð±ÑабоÑки даннÑÑ Ð¿ÐµÑепиÑи наÑÐµÐ»ÐµÐ½Ð¸Ñ Ð¡Ð¨Ð Ð² 1880, 1900 и 1910 г. ÐамеÑÑÑе, ÑÑо ÑÑа ÑиÑÑема не оÑÐµÐ½Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð° Ð´Ð»Ñ Ð½ÐµÐ°Ð½Ð³Ð»Ð¾ÑзÑÑнÑÑ Ð¸Ð¼Ñн.
ÐодÑÐ»Ñ fuzzystrmatch пÑедоÑÑавлÑÐµÑ Ð´Ð²Ðµ ÑÑнкÑии Ð´Ð»Ñ ÑабоÑÑ Ñ ÐºÐ¾Ð´Ð°Ð¼Ð¸ Soundex:
soundex(text) returns text difference(text, text) returns int
ФÑнкÑÐ¸Ñ soundex пÑеобÑазÑÐµÑ ÑÑÑÐ¾ÐºÑ Ð² код Soundex. ФÑнкÑÐ¸Ñ difference пÑеобÑазÑÐµÑ Ð´Ð²Ðµ ÑÑÑоки в иÑ
ÐºÐ¾Ð´Ñ Soundex и заÑем ÑообÑÐ°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ÑовпадаÑÑиÑ
позиÑий в ÑÑиÑ
кодаÑ
. Так как ÐºÐ¾Ð´Ñ Soundex ÑоÑÑоÑÑ Ð¸Ð· ÑеÑÑÑÑÑ
Ñимволов, ÑезÑлÑÑаÑом Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑиÑло Ð¾Ñ Ð½ÑÐ»Ñ Ð´Ð¾ ÑеÑÑÑÑÑ
(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;F.20.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 Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÐµÑедана лÑÐ±Ð°Ñ ÑÑÑока, оÑлиÑÐ½Ð°Ñ Ð¾Ñ NULL, не длиннее 255 Ñимволов. ÐаÑамеÑÑÑ ÑÑоимоÑÑи (ins_cost, del_cost, sub_cost) опÑеделÑÑÑ ÑÐµÐ½Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ, ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð·Ð°Ð¼ÐµÐ½Ñ Ñимволов, ÑооÑвеÑÑÑвенно. ÐÑи паÑамеÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ опÑÑÑиÑÑ, как во вÑоÑой веÑÑии ÑÑнкÑии; в ÑÑом ÑлÑÑае вÑе они по ÑмолÑÐ°Ð½Ð¸Ñ ÑÐ°Ð²Ð½Ñ 1.
ФÑнкÑÐ¸Ñ levenshtein_less_equal ÑвлÑеÑÑÑ ÑÑкоÑенной веÑÑией ÑÑнкÑии ÐевенÑÑейна, пÑедназнаÑенной Ð´Ð»Ñ Ð¸ÑполÑзованиÑ, ÑолÑко когда инÑеÑÐµÑ Ð¿ÑедÑÑавлÑÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑие ÑаÑÑÑоÑниÑ. ÐÑли ÑакÑиÑеÑкое ÑаÑÑÑоÑние менÑÑе или Ñавно 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.20.3. Metaphone
Metaphone, как и Soundex, поÑÑÑоен на идее ÑоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð°, пÑедÑÑавлÑÑÑего Ð²Ñ Ð¾Ð´Ð½ÑÑ ÑÑÑокÑ. Ðве ÑÑÑоки пÑизнаÑÑÑÑ Ð¿Ð¾Ñ Ð¾Ð¶Ð¸Ð¼Ð¸, еÑли Ð¸Ñ ÐºÐ¾Ð´Ñ ÑовпадаÑÑ.
ÐÑа ÑÑнкÑÐ¸Ñ Ð²ÑÑиÑлÑÐµÑ ÐºÐ¾Ð´ меÑаÑона Ð²Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑÑоки:
metaphone(text source, int max_output_length) returns text
РкаÑеÑÑве source должна пеÑедаваÑÑÑÑ ÑÑÑока, оÑлиÑÐ½Ð°Ñ Ð¾Ñ NULL, не длиннее 255 Ñимволов. ÐаÑамеÑÑ max_output_length задаÑÑ Ð¼Ð°ÐºÑималÑнÑÑ Ð´Ð»Ð¸Ð½Ñ Ð²ÑÑ
одного кода меÑаÑона; еÑли код оказÑваеÑÑÑ Ð´Ð»Ð¸Ð½Ð½ÐµÐµ, он обÑезаеÑÑÑ Ð´Ð¾ ÑÑой длинÑ.
ÐÑимеÑ:
test=# SELECT metaphone('GUMBO', 4);
metaphone
-----------
KM
(1 row)F.20.4. Double Metaphone
ÐлгоÑиÑм Double Metaphone (Ðвойной меÑаÑон) вÑÑиÑлÑÐµÑ Ð´Ð²Ðµ ÑÑÑоки Â«Ð¿Ð¾Ñ Ð¾Ð¶ÐµÐ³Ð¾ звÑÑаниÑ» Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑÑÑоки â «пеÑвиÑнÑÑ» и «алÑÑеÑнаÑивнÑÑ». РболÑÑинÑÑве ÑлÑÑаев они ÑовпадаÑÑ, но Ð´Ð»Ñ Ð½ÐµÐ°Ð½Ð³Ð»Ð¾ÑзÑÑнÑÑ Ð¸Ð¼Ñн в оÑобенноÑÑи они могÑÑ Ð±ÑÑÑ Ð²ÐµÑÑма ÑазлиÑнÑми, в завиÑимоÑÑи Ð¾Ñ Ð¿ÑоизноÑениÑ. ÐÑи ÑÑнкÑии вÑÑиÑлÑÑÑ Ð¿ÐµÑвиÑнÑй и алÑÑеÑнаÑивнÑй кодÑ:
dmetaphone(text source) returns text dmetaphone_alt(text source) returns text
Ðлина Ð²Ñ Ð¾Ð´Ð½ÑÑ ÑÑÑок Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»Ñбой.
ÐÑимеÑ:
test=# SELECT dmetaphone('gumbo');
dmetaphone
------------
KMP
(1 row)