Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Поиск по словарю ФИОДР или нечеткое сравнение слов.  [new]
estro
Member

Откуда: Казань
Сообщений: 34
Доброго времени суток.
Озадачился нечетким сравнением строк по исходным данным лиц: ФИОДР.
Т.е. задача следующая, ищем ИВАНОВА ИВАНА ИВАНОВИЧА 08.12.1962,
в БД есть и должны выйти в результат
ИВАНОВ ИВАН ИВАНОВИЧ 08.12.1962
ИВОНОВ ИВАН ИВОНОВИЧ 08.11.1962
ИВОНОВ ИВЕН ИВЕНОВИЧ 08.12.1962
ИВАНЬКОВ ИВАН ИВАНОВИЧ 08.12.1963
САВАНОВ ВАНО ВАНОВИЧ 01.12.1962
и оператор сам выбирает, кто ему нужен.
Читал (может мало читал), искал (может мало искал) решение данной проблемы, нашел только описание пакета utl_match, понравилось edit_distance, сделал словарь фамилий, имен, отчеств и даты рождения (j$slv_fiodr), партицировал ее

create table j$slv_fiodr
(id number(20), slv char(1), text varchar2(128) NOT NULL, date_in date,checked char(1) default 'F')
partition by list (slv)
(partition slv_f values ('F')
TABLESPACE USERS,
partition slv_i values ('I')
TABLESPACE USERS,
partition slv_o values ('O')
TABLESPACE USERS,
partition slv_d values ('D')
TABLESPACE USERS);

заполнил имеющимися данными

построил индексы

create unique index j$slv_fiodr_u on j$slv_fiodr(slv,text) tablespace indx;
create index j$slv_fiodr_id on j$slv_fiodr(id) tablespace indx;
create bitmap index j$slv_fiodr_slv on j$slv_fiodr(slv) local tablespace indx;
create index j$slv_fiodr_text on j$slv_fiodr(text) tablespace indx;
create bitmap index j$slv_fiodr_checked on j$slv_fiodr(checked) local tablespace indx;

Сделал таблицу связей с указанием длины расхождений (длину взял < 3)

create table j$relat_fiodr
(id_ot number(20), id_k number(20), slv char(1),dlina number(1))
partition by list (slv)
(partition slv_f values ('F')
TABLESPACE USERS,
partition slv_i values ('I')
TABLESPACE USERS,
partition slv_o values ('O')
TABLESPACE USERS,
partition slv_d values ('D')
TABLESPACE USERS);

Заполнил ее, построил индексы и тут возник вопрос, а как писать запросы и чтобы они быстро выдавали результаты?
Запросы типа

select *
from lica l
where L.FAMILIYA IN

(select F1.TEXT
from j$slv_fiodr f, J$RELAT_FIODR R, J$SLV_FIODR F1
where f.slv = 'F'
and f.text = 'ИВАНОВ'
AND F.ID = R.ID_OT
AND R.ID_K = F1.ID)

AND L.IMYA IN

(select F1.TEXT
from j$slv_fiodr f, J$RELAT_FIODR R, J$SLV_FIODR F1
where f.slv = 'I'
and f.text = 'ИВАН'
AND F.ID = R.ID_OT
AND R.ID_K = F1.ID)

AND L.OTCHESTVO IN

(select F1.TEXT
from j$slv_fiodr f, J$RELAT_FIODR R, J$SLV_FIODR F1
where f.slv = 'O'
and f.text = 'ИВАНОВИЧ'
AND F.ID = R.ID_OT
AND R.ID_K = F1.ID)

AND TO_CHAR(L.DATAROZHDEN, 'DD.MM.YYYY') IN

(select F1.TEXT
from j$slv_fiodr f, J$RELAT_FIODR R, J$SLV_FIODR F1
where f.slv = 'D'
and f.text = '08.12.1962'
AND F.ID = R.ID_OT
AND R.ID_K = F1.ID)

или

select *
from (select *
from (select *
from (select *
from lica l
where L.FAMILIYA IN

(select F1.TEXT
from j$slv_fiodr f,
J$RELAT_FIODR R,
J$SLV_FIODR F1
where f.slv = 'F'
and f.text = 'ИВАНОВ'
AND F.ID = R.ID_OT
AND R.ID_K = F1.ID)) fam

where fam.IMYA IN

(select F1.TEXT
from j$slv_fiodr f, J$RELAT_FIODR R, J$SLV_FIODR F1
where f.slv = 'I'
and f.text = 'ИВАН'
AND F.ID = R.ID_OT
AND R.ID_K = F1.ID)) im

where im.OTCHESTVO IN

(select F1.TEXT
from j$slv_fiodr f, J$RELAT_FIODR R, J$SLV_FIODR F1
where f.slv = 'O'
and f.text = 'ИВАНОВИЧ'
AND F.ID = R.ID_OT
AND R.ID_K = F1.ID)) ot

where TO_CHAR(ot.DATAROZHDEN, 'DD.MM.YYYY') IN

(select F1.TEXT
from j$slv_fiodr f, J$RELAT_FIODR R, J$SLV_FIODR F1
where f.slv = 'D'
and f.text = '08.12.1962'
AND F.ID = R.ID_OT
AND R.ID_K = F1.ID)

Работают не прилично долго.
Запросы красивые и правильные я писать не умею, но видимо и какие-либо идеи реализовывать тоже.
Подскажите пожалуйста кто что может? Может правильный запрос составить к данной структуре или структуру переделать или уе есть готовые решения (RCO не предлагать).
Всем спасибо.
22 янв 14, 17:22    [15453297]     Ответить | Цитировать Сообщить модератору
 Re: Поиск по словарю ФИОДР или нечеткое сравнение слов.  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
estro,

как, как..
шмхо, там, куда вас понесло, никак.
допрежде выдумывать турусы на колёсах, почитайте баяны
22 янв 14, 17:34    [15453367]     Ответить | Цитировать Сообщить модератору
 Re: Поиск по словарю ФИОДР или нечеткое сравнение слов.  [new]
estro
Member

Откуда: Казань
Сообщений: 34
orawish,

не совсем вас понял

"как, как..
шмхо, там, куда вас понесло, никак."

почему же никак
запрос типа

with fam as
(select *
from lica l
where upper(L.Familiya) IN

(select F1.TEXT
from j$slv_fiodr f, J$RELAT_FIODR R, J$SLV_FIODR F1
where f.slv = 'F'
and f.text = 'ИВАНОВ'
AND F.ID = R.ID_OT
AND R.ID_K = F1.ID)),

im as
(select *
from tor.o_lico l
where upper(l.imya) in (select F1.TEXT
from j$slv_fiodr f, J$RELAT_FIODR R, J$SLV_FIODR F1
where f.slv = 'I'
and f.text = 'ИВАН'
AND F.ID = R.ID_OT
AND R.ID_K = F1.ID)),

ot as
(select *
from tor.o_lico l
where upper(l.Otchestvo) in
(select F1.TEXT
from j$slv_fiodr f, J$RELAT_FIODR R, J$SLV_FIODR F1
where f.slv = 'O'
and f.text = 'ИВАНОВИЧ'
AND F.ID = R.ID_OT
AND R.ID_K = F1.ID)),

dr as
(select *
from tor.o_lico l
where TO_CHAR(l.Datarozhden, 'DD.MM.YYYY') in
(select F1.TEXT
from j$slv_fiodr f, J$RELAT_FIODR R, J$SLV_FIODR F1
where f.slv = 'D'
and f.text = '08.12.1962'
AND F.ID = R.ID_OT
AND R.ID_K = F1.ID))

select fam.*
from fam, im, OT, DR
where fam.kodobekta = im.kodobekta
AND OT.kodobekta = IM.kodobekta
AND DR.kodobekta = OT.kodobekta

отрабатывает за 1-2 секунды, что очень приемлимо, чего я и ждал.

"допрежде выдумывать турусы на колёсах, почитайте баяны"
я же написал
"Читал (может мало читал), искал (может мало искал) решение данной проблемы", так что зря вы меня в боянисты, и среди вашего "взвешивания" я таки нашел направление в with. За что вам спасибо. :)
23 янв 14, 16:01    [15457839]     Ответить | Цитировать Сообщить модератору
 Re: Поиск по словарю ФИОДР или нечеткое сравнение слов.  [new]
estro
Member

Откуда: Казань
Сообщений: 34
В итоге сам задал вопрос и сам его решил. :) Мдяя.
23 янв 14, 16:09    [15457900]     Ответить | Цитировать Сообщить модератору
 Re: Поиск по словарю ФИОДР или нечеткое сравнение слов.  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
estro
В итоге сам задал вопрос и сам его решил. :) Мдяя.

это нормально.
хуже другое - результат как был фигнёй, так (имхо) фигнёй и остался
23 янв 14, 16:30    [15458059]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить