Программирование >>  Oracle 

1 ... 282 283 284 [ 285 ] 286 287 288 ... 469


1268

Глава 17

3 / Index created.

Теперь можно искать строку по проиндексированному в HTML-документе слову.

SQI> select id from my html docs

2 where contains(htmltext, Oracle) > 0

SQL> select id from my html docs

2 where contains(html text, html) > 0

Легко создать запрос для поиска всех строк, содержащих слово Oracle, но в полученном решении очевидны два недостатка. Во-первых, элементы разметки индексировать не надо, поскольку они встречаются постоянно и во всех документах и не являются частью содержимого документа. Во-вторых, мы, конечно, можем искать слова в HTML-документе, но без учета структурных элементов, в которых они содержатся. Мы знаем, что где-то в тексте документа есть строка, содержащая слово Oracle, но это может быть заголовок, основной текст, колонтитул и т.п.

Предположим, в приложении необходимо обеспечить поиск в заголовках HTML-документов. Создадим для этого группу разделов с тегом TITLE, а затем удалим и заново создадим индекс:

SQL> begin

2 ctx ddl.create section group(my section group,BASIC SECTI0N GROUP);

3 ctx ddl.add field section(

4 group name => my section group,

5 section name => Title,

6 tag => title,

7 visible => FALSE) ;

8 end;

PL/SQL procedure successfully completed. SQL> drop index my html idx; Index dropped.

SQL> create index my html idx on my html docs(html text)

2 indextype is ctxsys.context

3 parameters(section group my section group)

Index created.

Мы создали новую группу разделов, MY SECTION GROUP, и добавили в нее раздел с именем Title. Обратите внимание, что раздел соответствует тегу title и будет неви-



interMedia

1269

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

Как и большинство современных языков разметки (например, XML, HTML, WML), начальный тег в interMedia Text начинается символом < и заканчивается символом >. Конечн1й тег начинается с последовательности символов </ и заканчивается символом >.

SQL> select id

2 from my html docs

3 where contains(html text, Oracle) > 0

no rows selected

Запрос, прежде возвращавший одну строку, теперь строк не возвращает, а мы ведь всего лишь задали группу разделов для индекса interMedia Text. Вспомните, что раздел Title был задан как невидимый, поэтому текст в тегах title рассматривается как подчиненный документ.

SQL> select id

2 from my html docs

3 where contains(html text, Oracle within title) > 0

Теперь можно выполнить запрос, выполняющий поиск только в разделах title всех документов. Если же попытаться искать текст самого тега, окажется, что компонент interMedia Text тег не проиндексировал:

SQL> select id

2 from my html docs

3 where contains( html text, title ) > 0

no rows selected

Хотя ранее я задал собственный тип группы разделов на основе группы разделов BASIC SECTION GROUP, в состав компонента interMedia входят также заранее заданные группы разделов со стандартными системными установками для языков HTML и XML (HTML SECTION GROUP и XML SECTION GROUP). Использование такой группы разделов не определяет автоматически разделы для всех возможных элементов HTML и XML. Это надо делать самому. Однако при использовании указанных групп разделов компонент interMedia Text сможет корректно преобразовать размеченный документ в обычный текст. Попробуем применить соответствующую заданную группу в рассмотренном примере:

SQL> drop index my html idx; Index dropped.



1270

Глава 17

SQL> create index my html idx on my html docs(html text)

2 indextype is ctxsys.context

3 parameters(section group ctxsys.html section group)

Index created.

SQL> select id

2 from my html docs

3 where contains(html text, html) > 0

no rows selected

Оказывается, задав системные установки, соответствующие группе разделов HTML SECTION GROUP, мы избежали индексирования строк, являющихся тегами разметки языка HTML. Это не только повышает точность запросов к документам, но и сокращает общий размер индекса interMedia Text. Предположим, необходимо найти слово title во всех хранящихся HTML-документах. Если не использовать для индекса interMedia Text группу HTML SECTION GROUP, в ответ на этот запрос могут быть выданы все HTML-документы, содержащие раздел title (речь идет о части HTML-документа, между тегами <title> и </title>). Игнорируя теги и ограничиваясь исключительно содержим1м HTML-документов, можно существенно повысить точность поиска.

Рассмотрение обработки XML-документов начнем с примера. Предположим, необходимо управлять подборкой XML-документов и обеспечить интерфейс для запросов к структурным элементам этих документов. Чтобы усложнить задачу, предположим, что не все собранные XML-документы соответствуют одному и тому же определению структуры, задаваемому определением типа документа (Document Type Definition - DTD).

По аналогии с предыдущим примером можно подумать, что необходимо определить все элементы XML-документов, в которых может потребоваться поиск, а затем задать раздел interMedia Text для каждого из этих элементов. К счастью, компонент interMedia Text включает средства автоматического создания и индексирования разделов по имеющимся в документе тегам.

Появившаяся в компоненте interMedia Text версии Oracle 8.1.6, группа разделов AUTO SECTION GROUP работает аналогично группе разделов XML SECTION GROUP, но снимает с разработчика приложений необходимость заранее определять все разделы. Группа разделов AUTO SECTION GROUP требует от компонента interMedia Text автоматически создать разделы для всех непустых тегов в документе. Хотя разработчик явно может сопоставить тегу любое имя раздела, при такой автоматической генерации имена разделов будут совпадать с соответствующими тегами.

SQL> create table my l docs

2 (id number primary key,

3 ldoc varchar2(40 0 0)

Table created.

SQL> insert into my l docs(id, ldoc) 2 values(1.



1 ... 282 283 284 [ 285 ] 286 287 288 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика