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

LEVENSHTEIN

Описание​

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

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

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

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

примечание

Начиная с 4.2.0

Псевдонимы​

  • LEVENSHTEIN_DISTANCE
  • EDIT_DISTANCE

Синтаксис​

LEVENSHTEIN(<str1>, <str2>)
LEVENSHTEIN_DISTANCE(<str1>, <str2>)
EDIT_DISTANCE(<str1>, <str2>)

Параметры​

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

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

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

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

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

Примеры​

  1. Базовое использование
SELECT levenshtein('kitten', 'sitting');
+----------------------------------+
| levenshtein('kitten', 'sitting') |
+----------------------------------+
| 3 |
+----------------------------------+

Строку kitten можно преобразовать в sitting с помощью 3 операций: заменить k на s, заменить e на i и вставить g в конец.

  1. Одинаковые строки
SELECT levenshtein('abc', 'abc');
+---------------------------+
| levenshtein('abc', 'abc') |
+---------------------------+
| 0 |
+---------------------------+
  1. Пустая строка
SELECT levenshtein('', 'abc'), levenshtein('数据库', '');
+------------------------+------------------------------+
| levenshtein('', 'abc') | levenshtein('数据库', '') |
+------------------------+------------------------------+
| 3 | 3 |
+------------------------+------------------------------+
  1. Символы UTF-8
SELECT levenshtein('你好世界', '你好世间');
+---------------------------------------------+
| levenshtein('你好世界', '你好世间') |
+---------------------------------------------+
| 1 |
+---------------------------------------------+

Замена 界 на 间 требует 1 операции редактирования.

  1. Перестановка соседних символов считается двумя операциями редактирования
SELECT levenshtein('abcd', 'abdc');
+-----------------------------+
| levenshtein('abcd', 'abdc') |
+-----------------------------+
| 2 |
+-----------------------------+

При вычислении расстояния Левенштейна перестановка соседних символов не считается одной операцией, поэтому расстояние между abcd и abdc равно 2.

  1. Использование псевдонимов
SELECT levenshtein_distance('abcd', 'abdc'), edit_distance('kitten', 'sitting');
+--------------------------------------+------------------------------------+
| levenshtein_distance('abcd', 'abdc') | edit_distance('kitten', 'sitting') |
+--------------------------------------+------------------------------------+
| 2 | 3 |
+--------------------------------------+------------------------------------+
  1. Аргументы со значением NULL
SELECT levenshtein(NULL, 'abc'), levenshtein('abc', NULL);
+--------------------------+--------------------------+
| levenshtein(NULL, 'abc') | levenshtein('abc', NULL) |
+--------------------------+--------------------------+
| NULL | NULL |
+--------------------------+--------------------------+