всем здравствуйте! есть ряд непоняток, но сначала эпиграф ввиде тесткейса: | Цитата | Connected to: Oracle Database 10g Release 10.2.0.4.0 - 64bit Production
SQL> /* создаю таблицу */ SQL> create table test_clob 2 (text clob) lob (text) store as nocache logging 3 /
Table created.
Elapsed: 00:00:00.03 SQL> SQL> /* наполняю таблицу 1 мил. записями */ SQL> begin 2 for i in 1..333333 3 loop 4 insert into test_clob 5 (text) 6 values ('Оказание услуг по инкассации денежных ' || sys_guid() || ' средств Государственног о учреждения - Регионального отделения Фонда социального страхования Российской Федерации по Республ ике Саха (Якутия) в 2010 году.'); 7 8 insert into test_clob 9 (text) 10 values ('Поставка медицинских инструментов для кардиохирургического отделения федерального государственного учреждения ' || sys_guid() || ' «Клиническая больница» Управления делами Президента Российской Федерации.'); 11 12 insert into test_clob 13 (text) 14 values ('Открытый аукцион № 20/10 на право заключить государственный контракт на поставку л акокрасочной продукции для обеспечения нужд ФГУ «Ленское ГБУВПиС»' || sys_guid()); 15 end loop; 16 end; 17 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:30.86 SQL> SQL> /* делаю проверку */ SQL> select count(*) from test_clob 2 /
COUNT(*) ---------- 999999
Elapsed: 00:00:00.17 SQL> SQL> /* собираю статстику по таблице */ SQL> begin 2 dbms_stats.gather_table_stats(ownname => 'KOROTINDV',tabname => 'TEST_CLOB',cascade => true);
3 end; 4 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.15 SQL> SQL> /* нахожу фразу лайком */ SQL> select count(*) 2 from test_clob 3 where text like '%заключит%' 4 /
COUNT(*) ---------- 333333
Elapsed: 00:00:08.45 SQL> SQL> /* создаю индекс для использования прелистей Oracle Text*/ SQL> create index test_clob_idx 2 on test_clob(text) 3 indextype is CTXSYS.CONTEXT 4 /
Index created.
Elapsed: 00:00:53.67 SQL> SQL> /* и собственно само использование */ SQL> select count(*) 2 from test_clob 3 where contains(text, '%заключит%', 1) > 0 4 /
COUNT(*) ---------- 333333
Elapsed: 00:00:01.61 SQL>
|
сам скрипт: | Код | /* создаю таблицу */ create table test_clob (text clob) lob (text) store as nocache logging /
/* наполняю таблицу 1 мил. записями */ begin for i in 1..333333 loop insert into test_clob (text) values ('Оказание услуг по инкассации денежных ' || sys_guid() || ' средств Государственного учреждения - Регионального отделения Фонда социального страхования Российской Федерации по Республике Саха (Якутия) в 2010 году.');
insert into test_clob (text) values ('Поставка медицинских инструментов для кардиохирургического отделения федерального государственного учреждения ' || sys_guid() || ' «Клиническая больница» Управления делами Президента Российской Федерации.');
insert into test_clob (text) values ('Открытый аукцион № 20/10 на право заключить государственный контракт на поставку лакокрасочной продукции для обеспечения нужд ФГУ «Ленское ГБУВПиС»' || sys_guid()); end loop; end; /
/* делаю проверку */ select count(*) from test_clob /
/* собираю статстику по таблице */ begin dbms_stats.gather_table_stats(ownname => 'KOROTINDV',tabname => 'TEST_CLOB',cascade => true); end; /
/* нахожу фразу лайком */ select count(*) from test_clob where text like '%заключит%' /
/* создаю индекс для использования прелистей Oracle Text*/ create index test_clob_idx on test_clob(text) indextype is CTXSYS.CONTEXT /
/* и собственно само использование */ select count(*) from test_clob where contains(text, '%заключит%', 1) > 0 /
|
вобщем целью использования Oracle Text было ускорение поиска слов, фраз, в больших объемах текстовой инфы. в принципе это получилось: поиск с LIKE выполнился за 00:00:08.45 поиск средствами Oracle Text за 00:00:01.61 при большем количестве строк разница действительно на порядок  проблемы которые нужно решить: 1) поиск не только по одному слову, требуется исполнить что то вроди text LIKE '%заключит%контракт%лакокрасочн%' т.е. найти строки по вхождению нескольких слов/части слова. 2) требуется исключить строки по вхождению нескольких слов, примерно так - text NOT LIKE '%инкассац%денежн%' 3) список слов по вхождению и по не вхождению может быть не ограничен, как правило не привышает 100 вариантов. т.е. в случае с лайком выглядело бы так: | Код | select count(*) from test_clob where ((text LIKE '%заключит%контракт%лакокрасочн%') or (text LIKE '%заключит222%контракт222%лакокрасочн222%') or (text LIKE '%заключит333%контракт333%лакокрасочн333%')) and ((text NOT LIKE '%инкассац%денежн%') or (text NOT LIKE '%инкассац222%денежн333%'))
|
прошу помощи в решении этой задачи средствами Oracle Text спасибо! Это сообщение отредактировал(а) DimW - 2.3.2010, 18:52
|