Verwaltung von Dokumenten mittels Oracle InterMedia Text
© Prof. T. Kudraß, HTWK Leipzig
Einführung
Text ist überall: Dokumente, Web-Seiten, Manuals, Reports, E-Mail, Präsentationen
Speziallösungen nachteilig, besser Nutzung und Erweiterung relationaler DBMSs
Bestandteil von Oracle interMedia seit Version 8i seit Version 9i Oracle Text, Bestandteil des Servers Verarbeitung strukturierter Texte: Indizieren und Suchen Volltextsuche in Dokumenten innerhalb und außerhalb
der Datenbank Dokumente in ca. 150 verschiedenen Formaten
© Prof. T. Kudraß, HTWK Leipzig
Architektur
Datastore Filter Sectioner LexerIndexingEngine
Wordlist
Stoplist
O/S File System
Internet
TokensTextMarked-up Text
Documents
Oracle TextIndex
Markup
© Prof. T. Kudraß, HTWK Leipzig
Datastore Objekt
Speicherung der Texte in DB, File System oder URL
Speicherungs-Optionen– Datenbank als Character-Spalte bis zu 4KB oder
LOB (Large Objekt) bis zu 2GB– File System, erreichbar vom DB-Server– Web, erreichbar über URL, Remote-Zugriff auf
andere Server via HTTP oder FTP– benutzerdefiniert: zu indizierender Text ist Output
einer PL/SQL-Prozedur Index ist immer in der Datenbank
© Prof. T. Kudraß, HTWK Leipzig
Filter Objekt
Filter für mehr als 150 Dateiformate, z.B. Microsoft Office, Adobe PDF, HTML, XML
Filter-Output ist HTML eigene Filter-Module möglich mögliche Objekte
– NULL_FILTER - ASCII-Filter (purer Text, keine Filterung)– INSO_FILTER - INSO-Filter für fomatierte Dokumente– USER_FILTER - benutzerdefinierter Filter– CHARSET_FILTER - Filter zum Konvertieren von Zeichen-
sätzen
© Prof. T. Kudraß, HTWK Leipzig
Sectioner Objekt
identifiziert Abschnitte (Sections) für jede Text-Einheit Section Group Types
– NULL_SECTION_GROUP: nur Sätze und Abschnitte im Text– BASIC_SECTION_GROUP: für Textteile, die Start- und
Endtags der Form <A> ... </A> haben– HTML_SECTION_GROUP: Abschnitte in HTML-Dokumenten– XML_SECTION_GROUP: Dokumente mit XML-Tags– NEWS_SECTION_GROUP: Dokumente mit Newsgroup-
Format
Beispiel:<TITLE>XML Handbook</TITLE>
erlaubt Suche zwischen Tags mittels WITHIN-Operator
© Prof. T. Kudraß, HTWK Leipzig
Lexer Objekt
Aufgabe:– separiert die Ausgabe des Sectioners in Wörter oder Token– in westlichen Sprachen: Aufsplitten des Textes in
ununterbrochene Zeichenketten
Beispiel:Aha! It‘s the 5:15 train, coming here now!
Aufteilung in Wörter ohne Interpunktion o.a. Symbole
“aha it s the 5 15 train coming here now“
Entfernung von Stop-Wörtern (deren Position im Index notiert)
“aha * * * 5 15 train coming * now“
© Prof. T. Kudraß, HTWK Leipzig
Lexer Preferences
verschiedene Optionen, wie Text in Token aufgebrochen wird, z.B. Join Characters“it‘s“ indiziert als “its“ oder “it‘s“
Unterstützung vieler Sprachen (westl., chinesisch) Base Letter Conversion: ‘Normalisierung‘ von Zeichen
mit Akzent– z.B. acción matcht accion und acción
Alternate Spelling:alternative Schreibweisen für Wörter mit Umlauten
– z.B. “Muenchen“ = “München“, beide als “Muenchen“ indiziert Compound Word Processing: Verarbeitung zusammen-
gesetzter Wörter
© Prof. T. Kudraß, HTWK Leipzig
Indexing Engine
erzeugt invertierten Index:– Liste von Wörtern mit Liste von Dokumenten, in
denen sie vorkommen
Stoplist: Angabe von Stop-Wörtern oder -Themen
drei Typen von Indexen:– Standard für Volltext-Suchen– Catalog für E-Business Katalog– Classification für Dokument-Klassifizierung
© Prof. T. Kudraß, HTWK Leipzig
Index-Typen
CONTEXT (Query-Operator CONTAINS)– für traditionelles Volltext-Retrieval in Dokumenten und
Webseiten– großer Umfang von Such-Möglichkeiten
CTXCAT (Query-Operator CATSEARCH)– Indexieren kleiner Text-Fragmente wie Gegenstand, Preis,
Beschreibung CTXRULE (Query-Operator MATCHES)
– zum Schreiben einer Dokumentklassifizierungs-Applikation– Index auf einer Tabelle von Queries, jede Query hat
Klassifikation– einzelne Dokumente können klassifiziert werden mittels
MATCHES-Operator
© Prof. T. Kudraß, HTWK Leipzig
Query-Operatoren
Keyword Searching– Suche nach Schlüsselwörtern (Keywords) im Dokument– Eingabe von ein oder mehr Keywords, die die Anfrage beschreiben
Context Queries– Suche nach Wörtern in einem gegebenen Kontext– Suche nach Text, der Wörter nahe beieinander enthält
Boolesche Operationen– Kombination von Keywords mit Booleschen Operationen
Linguistische Merkmale– Fuzzy und andere Techniken für natürliche Sprachverarbeitung
Pattern Matching– Suche nach Text, die Wörter beinhalten mit einem bestimmten
String
© Prof. T. Kudraß, HTWK Leipzig
Query-Operatoren im Detail
ABOUT Erhöht die Anzahl relevanter Dokumente, die von der gleichen Query zurückgeliefert werden
AND Suche nach Dokumenten, die mindestens einen Treffer für jeden der Query-Terme
Broader Term
Erweitert eine Anfrage, um einen Term einzufügen, der in einem Thesaurus als breiterer Term definiert wurde
Fuzzy Erweitert Anfragen, um Wörter einzufügen, die ähnlich wie der spezifizierte Term buchstabiert werden
HASPATH Findet alle XML-Dokumente, die einen speziellen Section Path beinhalten
© Prof. T. Kudraß, HTWK Leipzig
Query-Operatoren im Detail (2)
Narrow Term
Erweitert eine Anfrage, um alle Terme einzufügen, die im Thesaurus als engere Terme / auf einer niedrigeren Stufe definiert wurden
NEAR (;) Liefert einen Score, basierend auf der Nähe von zwei oder mehr Query-Termen
NOT (~) Suche nach Dokumenten, die einen bestimmten Query-Term nicht beinhalten
OR (|) Suche nach Dokumenten, die zumindest einen der angegebenen Query-Terme beinhalten
Preferred Term (PT)
Ersetzt einen Term in einer Query mit dem bevor-zugten Term, der im Thesaurus für den Term definiert ist
© Prof. T. Kudraß, HTWK Leipzig
Query-Operatoren im Detail (3)
Related Term (RT)
Erweitert eine Anfrage, um alle verwandten Terme einzufügen, die im Thesaurus definiert sind
Soundex (!)
Erweitert Anfragen, um Wörter einzufügen, die einen ähnlichen Klang haben wie andere Wörter
Stem ($) Sucht nach Termen, die dieselbe linguistische Wurzel haben wie der Anfrageterm
SYNonym Erweitert eine Anfrage, um alle Terme einzufügen, die im Thesaurus als Synonyme für den spez. Term definiert wurden
Top Term (TT)
Ersetzt einen Term in einer Anfrage mit dem Top-Term, der für diesen Term in der Hierarchie des Thesaurus definiert wurde
© Prof. T. Kudraß, HTWK Leipzig
Document Services
Highlighting– Hervorhebung der Wörter im Dokument, die zu einem Query-
Treffer beigetragen haben Markup
– Fortführung des Highlighting Service: produziert Text-Version vom Dokument mit matchenden Wörtern in Markup
Themen-Extraktion– “Theme“ beschreibt, wovon das Dokument handelt– somit Suche nach Dokumenten möglich, die von einem
bestimmten Gegenstand handeln, auch wenn dieser nicht explizit erwähnt
– Theme Queries liefern eine Hitliste von Dokumenten über den angefragten Gegenstand, zusammen mit einem Score, der anzeigt, wie stark Gegenstand im Dokument reflektiert wird
© Prof. T. Kudraß, HTWK Leipzig
Arbeiten mit Oracle Text
1. Definition der Text-Datenbankstruktur
2. Laden / Einfügen von Dokumenten
3. Anlegen eines Dokumentenindex
4. Stellen von Anfragen (Retrieval-Operationen)
5. Dokumentenpräsentation
© Prof. T. Kudraß, HTWK Leipzig
Kurzes Beispiel
Anlegen einer Tabelle:CREATE TABLE docs(id NUMBER PRIMARY KEY, text VARCHAR2(80));
Einfügen von DatenINSERT INTO docs VALUES (1,‘erstes Dokument‘);INSERT INTO docs VALUES (2,‘zweites Dokument‘);
Anlegen eines IndexCREATE INDEX doc_index ON docs(text) INDEXTYPE IS ctxsys.context;
AnfrageSELECT id FROM docs WHERE CONTAINS (text,‘erstes‘) > 0;
© Prof. T. Kudraß, HTWK Leipzig
Laden von Dokumenten
Dokumente standardmäßig in Textfeld geladen Einbinden des Dateisystems bzw. das Einbinden von
URL‘s sind möglich Varianten zum Laden von Daten
– SQL INSERT Anweisung– ctxload executable– SQL*Loader– DBMS_LOB.LOADFROMFILE() PL/SQL Prozedur zum Laden
von LOBs aus BFILEs Datentypen von Textfeldern: VARCHAR2, CLOB,
BLOB, CHAR oder BFILE Dokumentenformale: HTML, PDF, MS Word, Plain
Text
© Prof. T. Kudraß, HTWK Leipzig
Indizieren von Dokumenten
VoreinstellungenDatastore Wie sind die Dokumente gespeichert?
Filter Wie können die Dokumente in puren Text umgewandelt werden?
Lexer Welche Sprache soll verwendet werden?
Wordlist Wie sollen stem und fuzzy queries erweitert werden?
Storage Wie sollen die Indextabellen gespeichert werden?
Stop List Welche Wörter und Themen sollen nicht indiziert werden?
Section Group Sind Anfragen in den Abschnitten eines Dokuments möglich, und wie werden die Dokumentenabschnitte definiert?
© Prof. T. Kudraß, HTWK Leipzig
Retrieval-Operationen
Nutzung neuer struktureller Einheiten– Wörter, Sätze, Abschnitte
Neue Operationen– Boolean Search (bedingt in Oracle umgesetzt)– Ranking– Conceptual Search
Neue Anfrage- und Bearbeitungsmöglichkeiten– Einzelwortsuche– Suche von Phrasen– inhaltsbasierte Suche– Stopwort-Verarbeitung– Filtermöglichkeiten– erweiterte Suche (fuzzy Search, Synonyms,...)
© Prof. T. Kudraß, HTWK Leipzig
Retrieval Beispiele
Single Word SearchSELECT SCORE(1) titleFROM news WHERE CONTAINS(text,‘oracle‘,1) > 0;
Conceptual SearchSELECT SCORE(1) titleFROM news WHERE CONTAINS(text,‘about(politics)‘,1)>0;
Phrase SearchSELECT employee_name, SCORE(1)FROM employee_databaseWHERE CONTAINS (emp.resume,‘software developer‘) > 0;
Context Search– Suche nach Text im gleichen Satz– in Oracle nicht möglich
© Prof. T. Kudraß, HTWK Leipzig
Retrieval Beispiele (Forts.)
Ranking– “RANK“ existiert nicht– nur mit Umweg über SCORE(xxx) und Sortieren
bewerkstelligbar
WHERE CONTAINS (..) > 0
ORDER BY NVL(SCORE(10),0)
© Prof. T. Kudraß, HTWK Leipzig
Ausführliches Beispiel
DROP TABLE quick;CREATE TABLE quick( quick_id NUMBER PRIMARY KEY, text VARCHAR2(80));INSERT INTO quick VALUES (1,‘The cat sat on the mat‘); INSERT INTO quick VALUES (2,‘The quick brown fox jumps over the lazy dog‘);INSERT INTO quick VALUES (3,‘The dog barked like a dog‘);COMMIT; SELECT * FROM quick;EXECUTE ctx_ddl.drop_preference(‘odb08_datastore‘);EXECUTE ctx_ddl.drop_preference(‘odb08_lexer‘);EXECUTE ctx_ddl.drop_preference(‘odb08_wordlist‘);EXECUTE ctx_ddl.drop_stoplist(‘odb08_stoplist‘);EXECUTE ctx_ddl.create_preference(‘odb08_datastore‘, ‘DIRECT_DATASTORE‘);EXECUTE ctx_ddl.create_preference(‘odb08_lexer‘,‘BASIC_LEXER‘);
© Prof. T. Kudraß, HTWK Leipzig
Ausführliches Beispiel (2)
EXECUTE ctx_ddl.set_attribute(‘odb08_lexer‘,‘INDEX_TEXT‘,‘YES‘);EXECUTE ctx_ddl.set_attribute(‘odb08_lexer‘,‘INDEX_THEMES‘, ‘NO‘);EXECUTE ctx_ddl.create_preference(‘odb08_wordlist‘, ‘BASIC_WORDLIST‘);EXECUTE ctx_ddl.set_attribute(‘odb08_wordlist‘,‘STEMMER‘, ‘ENGLISH‘);EXECUTE ctx_ddl.create_stoplist(‘odb08_stoplist‘);EXECUTE ctx_ddl.add_stopword(‘odb08_stoplist‘,‘and‘);DROP INDEX quick_text;CREATE INDEX quick_text ON quick(text) INDEXTYPE IS ctxsys.context PARAMETERS (‘datastore odb08_datastore lexer odb08_lexer filter CTXSYS.NULL_FILTER wordlist odb08_wordlist stoplist odb08_stoplist‘);COMMIT;
© Prof. T. Kudraß, HTWK Leipzig
Ausführliches Beispiel (3)
COL text FORMAT a45COL s FORMAT 999SELECT text,SCORE(42)s FROM quickWHERE CONTAINS(text,‘dog‘,42) >= 0ORDER BY s DESC;
-- TEXT S-- ------------------------------------------- ----- The dog barked like a dog 7-- The quick brown fox jumps over the lazy dog 4-- The cat sat on the mat 0
Speichern von XML in Oracle
© Prof. T. Kudraß, HTWK Leipzig
Ansätze zum Speichern von XML
komplettes XML-Dokument in einer Tabellenspalte vom Typ CLOB (“authored XML“)
Aufteilung des XML-Dokuments in Teile und Speicherung in mehreren Spalten in einer oder mehreren Tabellen (“generated XML“) – vgl. Vorlesung über „XML + Datenbanken“
Kombination beider Ansätze (hybrider Ansatz)
© Prof. T. Kudraß, HTWK Leipzig
Authored XML
name document(CLOB)
Shopping Cart <Shopping Cart>
<Item sku = “1234567“>
<Desc>Fun with XML</Desc>
<Qty>1</Qty>
<Discount>10</Discount>
</Item>
(...)
</ShoppingCart>
(...) (...)
Speichern der XML-Dokumente in einer Tabellenspalte
XMLDOCS
© Prof. T. Kudraß, HTWK Leipzig
Generated XML
• nicht geeignet für XML-Dokumente mit komplexer Struktur• Alternative: Speicherung der XML-Elemente in mehreren Tabellen
Speichere jedes XML-Element in einer Tabellenspalte
SHOPPING_CART
id description quantity discount
1234 Fun with XML 1 10
3942 XML in Space 4 7
(...)
© Prof. T. Kudraß, HTWK Leipzig
Arbeit mit CLOBs (PL/SQL)
declare theClob CLOB; theBFile BFILE;begin insert into xmldocs(filename,document) values (‘Sample.xml‘, empty_clob()) returning document into theClob; theBFile:=BFileName(‘XMLFILES‘,‘Sample.xml‘); dbms_lob.fileOpen (theBFile); dbms_lob.loadFromFile (dest_lob=>theClob,
src=>theBFile,amount=>dbms_lob.getLength(theBFile));
dbms_lob.fileClose(theBFile); commit;end;
Speicherung von XML Files mittels DBMS_LOB Package
BFILE mit Source File assoziiert, Logical Directory Object XMLFILES vorher in Datenbank anlegen, z.B.>CREATE DIRECTORY xmlfiles as ‘c:\work‘
© Prof. T. Kudraß, HTWK Leipzig
Arbeit mit CLOBs (Java)
public class ReadCLOB { ... public static void main (String args[]{ DriverManager.registerDriver(new
oracle.jdbc.driver.OracleDriver()); Connection conn = DriverManager.getConnection( “jdbc:oracle:thin:@myComp:1521:ORCL“,“xuser“,“xuser“);
PreparedStatement p = conn.prepareStatement( “select doc from xmldocs where name = ?“);p.setString(1,args[0]);ResultSet rs = p.executeQuery();CLOB theCLOB = ((OracleResultSet)rs.getCLOB(1);// process the result, store document in a file...
}}
© Prof. T. Kudraß, HTWK Leipzig
Überblick interMedia Services
Eigenschaften von interMediaText– Volltext-Retrieval in der Oracle-Datenbank und
externen Dateien– Thesaurus-basierte Suche– Themenanalyse von (englischen) Dokumenten– Highlighting von Treffern (Hervorhebungen im
Dokument)
Oracle interMedia bietet Services zum Management großer Textdokumente und Multimedia-Daten, wie Bilder, Audio und Video
© Prof. T. Kudraß, HTWK Leipzig
Anwendungsentwicklung mit interMedia Text
2 Benutzer-Rollen:– CTXSYS: Eigentümer der interMedia Schema-Objekte– CTXAPP: Zugriff auf die Funktionen
Retrieval- und Speicherungsfunktionen:– Konvertieren von Texten mit Filtern– Sprachspezifisches Indizieren (“Lexer“)– Stammwortbasierte (stemming) und unscharfe Anfragen (fuzzy
logic) mittels Wordlist– Speicherung von Index-Tabellen– Anlegen von Stop-Word-Listen– Definition von Search Sections durch Section Groups
Setzen von Preferences
© Prof. T. Kudraß, HTWK Leipzig
Text Retrieval mit interMedia Text
SQL-Erweiterungen für Text-Retrieval contains Operator in der where-Klausel einer
Anfrage: Suche nach Wort-Übereinstimmungen in einem Dokument
score- Operator: berechnet Relevanz eines Treffers (in einem Bereich 1..100)
within-Klausel: beschränkt die Anfrage auf Abschnitte (Sections) eines Dokuments– wichtig bei XML Sections
übliche logische SQL-Operatoren: and, or, not
© Prof. T. Kudraß, HTWK Leipzig
Indizieren XML mit interMedia Text
Voraussetzung für tag-basierte Queries: Index auf den Anfragespalten
in SQL: CREATE INDEX erweitern um Klausel INDEXTYPE IS ctxsys.context
– erlaubt contains in where-Klausel Sectioner: Sammlung von XML-Tags, die indiziert
werden sollen– repräsentiert durch section group im CREATE INDEX-
Befehl / PARAMETERS Klausel– erlauben inhaltsbasiertes Retrieval, beschränkt auf spezifische
XML-Tags vordefinierte (für jedes Tag) vs. benutzerdefinierte
Sectioner
© Prof. T. Kudraß, HTWK Leipzig
Beispiel: Arbeit mit interMedia Text (1)
create table ins_claim(id number (7) primary key, when date, doc clob);
Speicherung von XML-Dokumenten einer Versicherungsgesellschaft
Spalte doc ist indiziert mit auto_section_group:
create index doc_ix on ins_claim(doc)indextype is ctxsys.contextparameters (‘section group ctxsys.auto_section_group‘);
© Prof. T. Kudraß, HTWK Leipzig
Beispiel: Arbeit mit interMedia Text (2)
The insured‘s <VEHICLE>car</VEHICLE>broke through the guard rail and plummeted into a ravine. The cause was determined to be <CAUSE>faulty brakes</CAUSE> Amazingly there were no casualties.
Beispiel-Dokument in der Spalte doc:
XML Section <cause> kann abgefragt werden:
select id, whenfrom ins_claimwhere contains (doc,‘brakes within cause‘) > 0;
ID WHEN DOC------- ------ -------1 12-OCT-00 The insured‘s <VEHICLE>car...
© Prof. T. Kudraß, HTWK Leipzig
Beispiel: Arbeit mit interMedia Text (3)
ctx_ddl.create_section_group(‘my_section‘, ‘XML_SECTION_GROUP‘);
ctx_ddl.add_zone_section(‘my_section‘,‘cause‘,‘Cause‘);...ctx_ddl.add_attr_section(‘my_section‘,‘make‘,‘Make@Vehicle‘);...create index my_doc_ix on ins_claim(doc)indextype is ctxsys.contextparameters(‘section group my_section‘);
Mögliche Abfrage ist Suche nach Attributwerten: ... where contains (doc, ‘Audi within Make@Vehicle‘)Findet: <Vehicle Make=“Audi“>
section name tag name
Alternative zu vordefiniertem Auto-Sectioner:Definition eines eigenen Sectioners und Verwendung im Index
Top Related