Проект посвящен СУБД Oracle - ее администрированию, разработке и настройке производительности приложений для Oracle, новым возможностям и особенностям версий.В рамках проекта предполагается публикация авторских статей, фрагментов кода и переводов, так или иначе связанных с СУБД Oracle, а также регулярные обзоры вопросов и ответов с сайтов AskTom и Ixora. Предполагается уделить особое внимание языку PL/SQL, особенностям Oracle SQL, основным вопросам администрирования этой СУБД.
Как классифицировать текстовые документы в Oracle![]() © Владимир Пржиялковский, Писание же твое приято бысть и разумлено внятельно. АннотацияВстроенная в СУБД Oracle текстовая поисковая машина Oracle Text способна не только выполнять полнотекстовый поиск в документах и по кратким описаниям, но и делать проверку на соответствие заданным по желанию условиям. Для этого применяется разновидность CTXSYS.CTXRULE текстового индекса и оператор MATCHES. В статье показаны примеры их употребления. Статью удобно рассматривать как продолжение публиковавшихся ранее "Oracle: работать с текстовыми документами очень просто", "Текстовые документы в Oracle: разнообразие источников, форматов, запросов" и "Как работать с картотекой (набором данных с краткими описаниями) ?". ВведениеВ настоящее время встроенная в СУБД Oracle поисковая текстовая машина Oracle Text поддерживает работу с тремя разновидностями предметного (DOMAIN), текстового индекса: типов CTXSYS.CONTEXT, CTXSYS.CTXCAT и CTXSYS.CTXRULE. Первые два обеспечивают поиск, соответственно, полнотекстовый - в полноценных документах, и в "картотеке" с краткими описаниями (так сказать, в "каталоге") - по предъявленному к тексту запросу. Тип же индекса CTXSYS.CTXRULE по отношению к ним не совсем обычен и может рассматриваться как "оборотный" к типу CTXSYS.CONTEXT. Он строится по набору запросов, а не по документам, и его назначение - определить результативность каждого запроса из этого применительно к предъявляемому документу. Запросы в наборе, по которому строится индекс, вольно иначе назвать "правилами" (отсюда слово rule в названии индекса ), и проверку соответствия определенного документа тому или иному правилу вольно, опять-таки, рассматривать как классифицирование документа. Простой примерСущественным технологическим отличием "оборотного" индекса CTXSYS.CTXRULE от CTXSYS.CONTEXT является то, что последний можно строить для документов как внутри БД, так и вне ее (файловая система, интернет), а первый - только для документов, "внутри", то есть хранящихся либо в переменной программы, либо в столбце типа VARCHAR2 или же CLOB таблицы БД (только эти два типа и допускает оператор MATCHES). Причина такого ограничения разработчиками не раскрывается. В этом простом примере будем считать, что документы хранятся в программе, в строке типа VARCHAR2. CREATE TABLE rules ( id NUMBER PRIMARY KEY, query VARCHAR2 ( 1000 ) ); Строим индекс и готовим сценарный файл для опытов: CREATE INDEX rules_idx ON rules ( query ) INDEXTYPE IS CTXSYS.CTXRULE; Проверяем соответствие трех "документов" шести заведенным "классификационным признакам": CTX> @matches 'Mary had a little lamb' Дальнейшие опыты рекомендуется провести самостоятельно. При необходимости следует воспользоваться известной из предыдущего материала процедурой CTX_DDL.SYNC_INDEX перестройки индекса. Также рекомендуется удостовериться, что в плане обработки наших запросов стоит обращение к индексу RULES_IDX (имеющийся там шаг обращения к таблице RULES вызван нашим желанием выдать значение поля ID строки из этой таблицы; если этого не сделать, обращение к таблице RULES пропадет). OBJECT_NAME OBJECT_TYPE А вот примерно какие появятся структуры хранения: SEGMENT_NAME SEGMENT_TYPE Очевидно, техническая организация индекса типа CTXSYS.CTXRULE почти та же, что и для типа CTXSYS.CONTEXT, то есть это четыре таблицы и необходимые для них служебные структуры. (Почти - потому что в таблице DR$RULES_IDX$I в нашем случае появилось дополнительное поле TOKEN_EXTRA. Дальнейшее изучение предлагается предпринять самостоятельно). Пример с реальными документамиПростой пример выше позволяет понять логику классификации и технические моменты. Теперь попытаемся рассмотреть более жизненный пример. Жизненной будет ситуация, в то время как технологически для лучшего понимания существенного далее все же будет сделан ряд допущений и технических упрощений. CTX> COLUMN link FORMAT A75 Вот начало документа HTML, расположенного по этой ссылке: Проделаем следующее: - Извлечем по этой ссылки документ в БД. Получаем документ из интернета EXECUTE UTL_HTTP.SET_PROXY ('http://имя:пароль@адрес:порт') Для извлечения документа из интернета мне очень хотелось бы воспользоваться типом HTTPURITYPE, но проверка показывает, что этот тип не способен посылать запросы HTTP методом POST, а для нашей страницы, опять-таки показывает проверка, требуется именно это. Притом, страница динамическая: обратите внимание на завершение адреса текстом ?rssid=rss_otn_news. (Несложная проверка параметров ответа при обращении по этому адресу показывает, что получателем запроса является сервлет на Oracle Application Server). Поэтому придется прибегнуть к пакету UTL_HTTP и программированию. VARIABLE url VARCHAR2 ( 1000 ) Для простоты количество символов в подстроке параметров (18) я посчитал вручную. VARIABLE htmlclob CLOB При работе учтите, что значение переменной SQL*Plus типа CLOB потеряется, как только вы завершите сеанс связи с СУБД, например в результате выдачи CONNECT. (В действительности, переменная HTMLCLOB есть переменная-"локатор", указывающий на временный LOB-объект со временем жизни сеанса; этот-то LOB-объект и пропадает без нашей воли по завершению сеанса, после чего локатор начнет указывать "в никуда"). DECLARE Выдача на экран добавлена для контроля. Проверить, что документ действительно прочитался, можно, например, так: CTX> EXECUTE DBMS_OUTPUT.PUT_LINE ( DBMS_LOB.GETLENGTH ( :htmlclob ) ) При желании можно было пометить документ в таблицу, но здесь довольно и оставить его в переменной SQL*Plus. CREATE TABLE category ( id NUMBER, query VARCHAR2 ( 2000 ) ); Проверка: CTX> COLUMN query FORMAT A60 В данном случае документ удовлетворяет четырем категориям имеющейся классификации под номерами 1 - 4 и не удовлетворяет категории под номером 5. В жизни может быть сложнееРеальность нередко оказывается сложнее, чем хотелось бы. Вот примеры. ЗаключениеМатериала настоящей статьи, а также трех предшествующих, посвященных возможностям Oracle Text, достаточно для понимания того, как запрограммировать автоматический сбор новостей из интернета и выполнять автоматическую классификацию. |
Tecon Ltd. © 2001 - 2018
All Rights Reserved.