F.22. fuzzystrmatch#
F.22. fuzzystrmatch
Модуль fuzzystrmatch
предоставляет несколько функций для определения сходства и расстояния между строками.
Предостережение
В настоящее время функции soundex
, metaphone
,
dmetaphone
и dmetaphone_alt
не работают хорошо с многобайтовыми кодировками (например, UTF-8).
Этот модуль считается "доверенным", то есть его можно установить
недоступным пользователям, у которых есть привилегия CREATE
в текущей базе данных.
F.22.1. Soundex
Система Soundex - это метод сопоставления похожих по звучанию имен, преобразуя их в одинаковый код. Изначально он был использован Всемирной переписью населения США в 1880, 1900 и 1910 годах. Обратите внимание, что Soundex не очень полезен для неанглийских имен.
Модуль fuzzystrmatch
предоставляет две функции для работы с кодами Soundex:
soundex(text) returns text difference(text, text) returns int
Функция soundex
преобразует строку в ее код Soundex.
Функция difference
преобразует две строки в их коды Soundex
и затем сообщает количество совпадающих позиций кодов. Поскольку
коды Soundex имеют четыре символа, результат может быть от нуля до четырех,
где ноль означает отсутствие совпадения, а четыре - точное совпадение. (Таким образом,
функция имеет неправильное название — 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.22.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 символов. Параметры стоимости определяют, сколько стоит вставка, удаление или замена одного символа соответственно. Вы можете опустить параметры стоимости, как во второй версии функции; в этом случае все они устанавливаются по умолчанию равными 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)
F.22.3. Метафон
Metaphone, как и Soundex, основан на идее создания представительного кода для входной строки. Затем две строки считаются похожими, если у них есть одинаковые коды.
Эта функция вычисляет код метафона входной строки:
metaphone(text source, int max_output_length) returns text
Входной параметр source
должен быть непустой строкой с максимальной длиной 255 символов. Параметр max_output_length
устанавливает максимальную длину кода metaphone в выводе; если длина превышает это значение, вывод будет обрезан до указанной длины.
Пример:
test=# SELECT metaphone('GUMBO', 4); metaphone ----------- KM (1 row)
F.22.4. Double Metaphone
Система Double Metaphone вычисляет две строки "звучит как" для заданной входной строки - "основную" и "альтернативную". В большинстве случаев они одинаковы, но для неанглийских имен, особенно, они могут немного отличаться в зависимости от произношения. Эти функции вычисляют основной и альтернативные коды:
dmetaphone(text source) returns text dmetaphone_alt(text source) returns text
Входные строки не имеют ограничений по длине.
Пример:
test=# SELECT dmetaphone('gumbo'); dmetaphone ------------ KMP (1 row)