возникла потребность реализации нечеткого поиска по нескольким полям таблицы. в связи с этим появился вопрос: каким образом реализовать нечеткий поиск по нескольким полям.
дано:
БД Oracle версии 11.2.0.4
таблицы Клиент(ФИО, ДопИнформация) и Стоплист(ФИО)
необходимо:
при заведении клиента проверить нет ли такого человека в таблице Стоплист. при этом надо учесть что оператор может ошибиться и вбить неправильно ФИО (напр.: Иванов — Ивонов, но чаще казусы случаются с ФИО иностранных граждан Мухамед — Мухамет — Мухамбет — Муххамед — и тд). при нахождении вывести список совпадений для того чтобы оператор мог визуально сверить и принять решение о вводе данного клиента в таблицу.
у Oracle есть несколько вариантов реализации
1 проидексировать поле CTXSYS.CONTEXT и потом строить запросы. но у нас стоит версия БД 11.2.0.4 в которой AUTO_LEXER отключен. может ли решить вопрос поднятие БД версии 12с и настройки db link между ними только для проверки схожести?
2 или воспользоватся процедурой UTL_MATCH.EDIT_DISTANCE?
3 может есть другой вариант?
Здравствуйте, irq, Вы писали:
irq> 1 проидексировать поле CTXSYS.CONTEXT и потом строить запросы.
CTXSYS.CONTEXT это не нечеткий поиск. Это полнотекстовый поиск для естественного языка. Это две большие разницы.
irq> 2 или воспользоватся процедурой UTL_MATCH.EDIT_DISTANCE?
Это можно.
irq> 3 может есть другой вариант?
Приведение ФИО к некоторому каноническому представлению и поиск по нему. То есть SOUNDEX и его аналоги для русского языка. Помню, попадались даже реализации на PL/SQL.
С версии 11.2 есть некоторая поддержка нечеткого поиска имен для немецкого, датского и шведского языков (оператор NDATA). Появилась ли в 12 версии поддержка русского — не знаю, но думаю что нет.
Есть также сторонние коммерческие решения для полнотекстового поиска для русского языка. В них скорее всего реализован и нечеткий поиск по именам.
Здравствуйте, wildwind, Вы писали:
W>Здравствуйте, irq, Вы писали:
irq>> 1 проидексировать поле CTXSYS.CONTEXT и потом строить запросы.
W>CTXSYS.CONTEXT это не нечеткий поиск. Это полнотекстовый поиск для естественного языка. Это две большие разницы.
правильно ли я вас понял: полнотекстовый поиск это поиск с учетом морфологии языка (то есть слово идти найдется по следующим словам — шел, пришел, ушел и тд)?
Здравствуйте, irq, Вы писали:
irq> правильно ли я вас понял: полнотекстовый поиск это поиск с учетом морфологии языка (то есть слово идти найдется по следующим словам — шел, пришел, ушел и тд)?
В общем да. А в этом примере не уверен, что найдется сразу. Думаю, эти слова нужно вносить в словарь синонимов (тезаурус).
Здравствуйте, wildwind, Вы писали:
W>Здравствуйте, irq, Вы писали:
irq>> правильно ли я вас понял: полнотекстовый поиск это поиск с учетом морфологии языка (то есть слово идти найдется по следующим словам — шел, пришел, ушел и тд)?
W>В общем да. А в этом примере не уверен, что найдется сразу. Думаю, эти слова нужно вносить в словарь синонимов (тезаурус).