Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Oracle interMedia, или Oracle Text 
:(
    Опции темы
DimW
Дата 2.3.2010, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



всем здравствуйте!

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

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 - 2.3.2010, 18:52
PM MAIL ICQ   Вверх
DimW
Дата 5.3.2010, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



если кому то интересно - продолжение темы тут.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0431 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.