Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Oracle interMedia


Автор: DimW 2.3.2010, 18:51
всем здравствуйте!

есть ряд непоняток, но сначала эпиграф ввиде тесткейса:
Цитата

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
при большем количестве строк разница действительно на порядок smile

проблемы которые нужно решить:
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 5.3.2010, 14:34
если кому то интересно - продолжение темы http://www.sql.ru/forum/actualthread.aspx?bid=3&tid=740081.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)