@Ang5545

Как в sql сделать поиск по фамилии с опечатками?

Необходимо осуществить поиск по фамилий клиентам допуская, например, одну опечатку.
Пока ничего лучше чем
and(1=0
or t.FAMILY like '%Фамилия%'
or t.FAMILY like '%_амилия%'
or t.FAMILY like '%Ф_милия%'
or t.FAMILY like '%Фа_илия%'
or t.FAMILY like '%Фам_лия%'
or t.FAMILY like '%Фами_ия%'
or t.FAMILY like '%Фами__я%'
or t.FAMILY like '%Фамили_%'
)
не придумал.
(Использую db2)
  • Вопрос задан
  • 6247 просмотров
Пригласить эксперта
Ответы на вопрос 4
@Sumor
К сожалению не сильно знаком с DB2, но думаю подходы примерно одинаковые.
Во-первых, поиск можно сделать регистронезависимым на уровне БД или таблицы. В MSSQL он по-умолчанию регистронезависимый. Гуглить по словам COLLATION COLLATE. Например посмотреть тут.

Ну а дальше можно использовать алгоритмы нечёткого поиска.
Достаточно подробно в соответствующей статье на Хабре.
Если у вас БД небольшая (до тысяч фамилий), то можно её банально пробежать и сравнить с искомой по расстоянию Дамерау-Левенштейна. Оформить можно функцией. Работать будет примерно так:
SELECT * FROM People WHERE Distance(People.Family, 'Иванов') < 2

Если сравнение по расстоянию занимает много времени, то можно применить алгоритм триграмм.
Повесить триггер на вставку/изменение: генерировать по фамилии триграммы и складывать в отдельную таблицу.
Тогда для поиска необходимо искомую фамилию также разложить на триграммы и искать их в таблице триграмм.
Примерная фамилия должна соответствовать почти всем искомым триграммам.

Можно использовать механизмы свёрток, по типу SOUNDEX, но они дают большой шум и работают хорошо только при записи фамилий на слух.
Ответ написан
saboteur_kiev
@saboteur_kiev
software engineer
В принципе можно автоматизировать процесс с опечаткой, то есть чтобы скрипт разбирал введенное слово и сам подставлял варианты с опечаткой.

Ну и простейшие обработки, например приводить введенное имя к нужному регистру перед тем как отправлять sql запрос, проверять наличие англоязычных букв и цифр, заменять их на соответствующие русские или удалять.
Ответ написан
@kPers
Ruby way like
RTRIM(LTRIM(@Фамилия)) + '%';
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы