Speichern von XML in Oracle
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)
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
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
(...)
Speichern von XML Files als CLOBs
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;
BFILE mit Source File assoziiert, Logical Directory Object XMLFILES vorher in end;
Datenbank anlegen, z.B.
>CREATE DIRECTORY xmlfiles as ‘c:\work‘
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...
} }
Ü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
Architektur
Datastore Filter Sectioner Lexer Indexing
Engine Wordlist
Stoplist
O/S File System Internet
Tokens Marked Text
-up Text Documents
Oracle Text Index
Markup
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
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
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
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.context
parameters (‘section group ctxsys.auto_section_group‘);
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 braked</CAUSE> Amazingly there were no
casualties.
Beispiel-Dokument in der Spalte doc :
XML Section <cause> kann abgefragt werden:
select id, when from ins_claim
where contains (doc,‘brake within cause‘) > 0;
ID WHEN DOC
--- --- ---
1 12-OCT-00 The insured‘s <VEHICLE>car...
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.context
parameters(‘section group my_section‘);
Alternative zu vordefiniertem Auto-Sectioner:
Definition eines eigenen Sectioners und Verwendung im Index
Mögliche Abfrage ist Suche nach Attributwerten:
... where contains (doc, ‘Audi within Make@Vehicle‘) Findet: <Vehicle Make=“Audi“>
section name tag name