Перейти к содержимому
Последнее обновление

DAMERAU_LEVENSHTEIN_DISTANCE

Описание​

Функция DAMERAU_LEVENSHTEIN_DISTANCE вычисляет расстояние редактирования Дамерау-Левенштейна между двумя строками.

Расстояние редактирования Дамерау-Левенштейна представляет собой минимальное количество операций над отдельными символами, необходимых для преобразования одной строки в другую. Поддерживаются следующие операции редактирования:

  • Вставка символа
  • Удаление символа
  • Замена символа
  • Перестановка двух соседних символов

По сравнению с LEVENSHTEIN, DAMERAU_LEVENSHTEIN_DISTANCE считает перестановку соседних символов одной операцией редактирования, поэтому лучше подходит для обработки ошибок ввода, вызванных обратным порядком символов. Например, для преобразования abcd в abdc достаточно поменять местами соседние символы c и d, поэтому расстояние Дамерау-Левенштейна равно 1, а расстояние Левенштейна равно 2.

Функция вычисляет расстояние по символам UTF-8, а не по байтам. Поэтому многобайтовые символы, например китайские иероглифы, считаются одним символом.

примечание

Начиная с версии 4.2.0

Синтаксис​

DAMERAU_LEVENSHTEIN_DISTANCE(<str1>, <str2>)

Параметры​

ПараметрОписание
<str1>Первая строка. Тип: VARCHAR
<str2>Вторая строка. Тип: VARCHAR

Возвращаемое значение​

Возвращает значение типа INT, представляющее расстояние редактирования Дамерау-Левенштейна между двумя строками.

Особые случаи:

  • Если хотя бы один аргумент равен NULL, возвращает NULL.
  • Если строки совпадают, возвращает 0.
  • Если одна строка пустая, возвращает количество символов в другой строке.
  • Функция коммутативна: DAMERAU_LEVENSHTEIN_DISTANCE(a, b) и DAMERAU_LEVENSHTEIN_DISTANCE(b, a) возвращают одинаковый результат.
  • Если входные данные слишком велики и из-за этого внутренняя матрица расстояний превышает установленный предел, функция возвращает ошибку.

Примеры​

  1. Базовое использование
SELECT damerau_levenshtein_distance('kitten', 'sitting');
+---------------------------------------------------+
| damerau_levenshtein_distance('kitten', 'sitting') |
+---------------------------------------------------+
| 3 |
+---------------------------------------------------+
  1. Перестановка соседних символов
SELECT damerau_levenshtein_distance('abcd', 'abdc');
+----------------------------------------------+
| damerau_levenshtein_distance('abcd', 'abdc') |
+----------------------------------------------+
| 1 |
+----------------------------------------------+

abcd можно преобразовать в abdc, поменяв местами соседние символы c и d, поэтому расстояние равно 1.

  1. Отличие от LEVENSHTEIN
SELECT levenshtein('abcd', 'abdc'), damerau_levenshtein_distance('abcd', 'abdc');
+-----------------------------+----------------------------------------------+
| levenshtein('abcd', 'abdc') | damerau_levenshtein_distance('abcd', 'abdc') |
+-----------------------------+----------------------------------------------+
| 2 | 1 |
+-----------------------------+----------------------------------------------+

LEVENSHTEIN не поддерживает перестановку символов, поэтому требует 2 операции редактирования. DAMERAU_LEVENSHTEIN_DISTANCE поддерживает перестановку соседних символов, поэтому требует лишь 1 операцию редактирования.

  1. Символы UTF-8
SELECT damerau_levenshtein_distance('你好', '好你');
+--------------------------------------------------+
| damerau_levenshtein_distance('你好', '好你') |
+--------------------------------------------------+
| 1 |
+--------------------------------------------------+

你 и 好 представляют собой два символа UTF-8, а перестановка соседних символов требует 1 операции редактирования.

  1. Вставка, удаление и замена
SELECT
damerau_levenshtein_distance('', 'abc'),
damerau_levenshtein_distance('数据库', '数据'),
damerau_levenshtein_distance('flaw', 'lawn');
+-----------------------------------------+-----------------------------------------------------+----------------------------------------------+
| damerau_levenshtein_distance('', 'abc') | damerau_levenshtein_distance('数据库', '数据') | damerau_levenshtein_distance('flaw', 'lawn') |
+-----------------------------------------+-----------------------------------------------------+----------------------------------------------+
| 3 | 1 | 2 |
+-----------------------------------------+-----------------------------------------------------+----------------------------------------------+
  1. Пример полного расстояния Дамерау-Левенштейна
SELECT damerau_levenshtein_distance('CA', 'ABC');
+-------------------------------------------+
| damerau_levenshtein_distance('CA', 'ABC') |
+-------------------------------------------+
| 2 |
+-------------------------------------------+

Функция вычисляет полное расстояние Дамерау-Левенштейна. Для CA и ABC минимальное расстояние редактирования равно 2.

  1. Аргументы NULL
SELECT damerau_levenshtein_distance(NULL, 'abc'), damerau_levenshtein_distance('abc', NULL);
+-------------------------------------------+-------------------------------------------+
| damerau_levenshtein_distance(NULL, 'abc') | damerau_levenshtein_distance('abc', NULL) |
+-------------------------------------------+-------------------------------------------+
| NULL | NULL |
+-------------------------------------------+-------------------------------------------+
  1. Слишком большой объём входных данных
SELECT damerau_levenshtein_distance(repeat('a', 4096), repeat('b', 4096));
ERROR 1105 (HY000): errCode = 2, detailMessage = (127.0.0.1)[INVALID_ARGUMENT]damerau_levenshtein_distance distance matrix is too large: 16793604 cells exceeds limit 16777216