Оценка похожести строк через Fuzzy Search

Использование функционала поиска в HANA довольно обширная тема, которой посвящена отдельный гайд в документации.

В данной же статье хотелось бы рассмотреть её небольшую часть, а именно нечёткий поиск или Fuzzy Search для оценки похожести строк.

В целом нечёткий поиск может быть использован в разных сценариях, например:

  • Для облегчения поиска пользователя, когда заранее может быть неизвестно точное наименование материала или номера документа.
  • Для поиска по заранее определённым столбцам, когда пользователь ищет некоторый адрес вводя индекс или часть названия улицы.
  • Для сопоставления распознанных данных в каком-нибудь OCR движке (который может иногда выдавать не 100% результат) с тем что лежит в системе.

В ABAP есть встроенный механизм позволяющий оценить похожесть двух строк — функция distance, которая работает на базе алгоритма подсчёта расстояния Левенштейна.

Функция возвращает количество операций удаления, вставки и изменения, необходимых для преобразования одной строки в другую. Однако данная функция в отличие от Fuzzy Search не обладает той же гибкостью.

Fuzzy Search в средствах поиска

Если Вы работаете в более менее современных системах на базе СУБД HANA, то наверное уже замечали встроенный механизм нечёткого поиска при вводе в средствах поиска, например поиск по имени класса:

В соответствующем СП выставлены параметры нечёткого поиска:

В интерфейсах вызова СП появились соответствующие опции:

Внутри вызывается движок SADL и преобразование к Native SQL следующего вида:

Обратите внимание на режим поиска: similarCalculationMode=search. Позже рассмотрим этот и другие режимы когда будем рассматривать сопоставления строк.

Синтаксис вызова Fuzzy Search в SQLScript

Упрощённый синтаксис вызова Fuzzy Search в SQLScript выглядит следующим образом:

В данном запросе мы найдём все строки в таблице table_name, где для поля column_name будут найдены значения, уровень похожести которых на «123» будет более 0.8.

  • Уровень похожести определяется числом от 0 до 1, где 1 — полное соответствие.
  • Значение 0.0 переданное в функцию FUZZY будет обозначать выборку всех значений > 0.
  • Функция SCORE() выдаёт результат оценки похожести.

Функция CONTAINS может быть использована для разного рода поиска, но в данном случае используется именно нечёткий поиск — функция FUZZY.

Функция FUZZY можно настраивать через передачу параметров:

Поиск может быть выполнен с учётом нескольких столбцов:

Внутри функции CONTAINS можно использовать специальный синтаксис запросов включающий в себя зарезервированные слова и символы:

  • CONTAINS(col, ‘sap OR hana’), где OR (чувствителен к регистру) обозначает ИЛИ, выбрать все значения где есть sap или hana.
  • CONTAINS(col, ‘sap -hana’), выбрать все значения где есть sap, но не hana.
  • CONTAINS(col, ‘»sap hana»‘), если брать в двойных кавычках поиск будет по фразе целиком.
  • * (%) или ?, активируют поиск по шаблону, при этом нечёткий поиск выполняться не будет.

Следует учитывать что при передаче параметров в функцию FUZZY одновременно с вышеуказанными параметрами CONTAINS запрос разбивается на подзапросы:

Аналогичное поведение будет при использовании поиска по нескольким столбцам:

Если внутри запроса используется поиск по нескольким полям, функция SCORE будет возвращать средневзвешенное значение по всем полям используемым в запросе:

Вес каждого поля по умолчанию равен 1 (т.е. при оценке они равны между собой), допускается ручное указание весов:

Оценка похожести строк

С помощью опции similarCalculationMode мы можем определить то, каким образом будет оцениваться похожесть строк.

Похожесть строки А (строка поиска) по отношению к строке Б (строка в таблице) оценивается на основании следующих критериев:

  • общие символы в А и Б
  • дополнительные символы в строке А
  • дополнительные символы в строке Б
  • ошибочные символы (опечатки) в строке А

По своей сути допустимые для выставления режимы сопоставления отличаются влиянием вышеуказанных критериев на результат:

Режим Опечатки Доп. символы в А Доп. символы в Б
compare (по умолчанию) среднее высокое высокое
search высокое высокое низкое
searchCompare среднее/высокое высокое низкое
symmetricsearch высокое среднее среднее
substringsearch высокое высокое низкое
typeAhead высокое очень высокое низкое
flexible управляется параметром errorDevaluate очень высокое управляется параметром lengthTolerance

Рассмотрим на примерах:

Строка А Строка Б compare typeAhead searchCompare
search searching 0.76 1.0 1.0
search seerch 0.85 0.85 0.85
search searchingforextraterrestriallife 0.0 0.91 0.91
searchingforextraterrestriallife searching 0.0 0 0
searchingforextraterrestriallife seerch 0.0 0 0
searchingforextraterrestriallife searchingforthemeaningoflife 0.6 0.6 0.6
Строка А Строка Б search symmetric substring
search searching 0.96 0.86 0.9
search seerch 0.75 0.75 0.8
search searchingforextraterrestriallife 0.91 0.87 0.88
searchingforextraterrestriallife searching 0.35 0.84 0
searchingforextraterrestriallife seerch 0.24 0.79 0
searchingforextraterrestriallife searchingforthemeaningoflife 0.57 0.6 0

Более подробное пояснение по каждому из режимов можно найти в официальной документации.

Вызов из ABAP

Вызвать функционал сопоставления строк через Fuzzy Search можно в AMDP процедуре:

В классе можно воспользоваться как ABAP режимом сопоставления через функцию distance, так и прочими режимами рассмотренными ранее.

Программа для тестирования сопоставлений:

 

1 комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *