|
Программирование >> Oracle
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.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |