Neues in Oracle Text Autorin: Ulrike Schwinn, ORACLE Deutschland GmbH Oracle Text ist seit jeher die integrierte Volltextsuche der Oracle Datenbank in der Standard und Enterprise Edition, um Dokumente und Texte innerhalb und außerhalb der Datenbank zu indizieren, zu suchen und zu analysieren. Wachsende Mengen an gespeicherten Daten, steigende Anforderungen an die Performance und die hohen Anforderungen an die Hochverfügbarkeit sind Herausforderungen, die Oracle im neuesten Datenbank-Release adressiert. Mit Oracle Text können linguistische Suchen, Mustersuchen, Suchen mit Booleschen Operatoren, Abschnittssuchen bei XML- und HTML-Formaten durchgeführt werden, um nur einige Features von Oracle Text zu nennen. Das Resultat kann in verschiedenen Formaten ausgegeben werden, wie etwa unformatiert, als HTML mit Highlighting oder natürlich im Originalformat. Grundsätzlich werden dabei verschiedene Sprachen unterstützt. Um die Suchqualität zu erhöhen, wird zusätzlich die Technik des Relevanz Rankings genutzt. Nicht nur die unterschiedlichen Oracle-Entwicklungen in Bereichen wie Verlagswesen, Web-Anwendungen oder Rundfunkanstalten nutzen Oracle Text, sondern Oracle selbst verwendet Text in eigenen Produkten wie zum Beispiel in Secure Enterprise Search oder Oracle Content DB. Mit der Datenbank 11g wurde das Spektrum an interessanten Funktionen erweitert. In folgenden Bereichen sind Neuigkeiten zu finden: Performance Funktionalität Manageability Verfügbarkeit Der Artikel konzentriert sich auf diese vier Bereiche, um einige Verfahren aus der Datenbank 10g zur Sprache zu bringen und an Beispielen ausgewählte neue 11g-Features zu illustrieren. Mehr Performance für Mixed Queries Eine Mixed Query kombiniert eine relationale Abfrage mit einer Volltext- Recherche und könnte zusätzlich noch sortierte Ausgaben erfordern. Ein ty- pisches Beispiel ist eine kombinierte Text- und Datumsabfrage im WHERE- Filter oder einfach nur eine Textabfrage in Kombination mit einer weiteren relationalen Abfrage. Dies kann zu Performance-Einbußen führen, besonders wenn weder der Textanteil noch der strukturelle Anteil sehr selektiv sind. Folgendes Beispiel zeigt eine Mixed Query: SELECT item_id FROM items WHERE CONTAINS (author, ʻ William Shakespeare ʻ) > 0 AND type = ʻBOOKʼ AND price < 10 ORDER BY price Ab Oracle 10g gibt es ein neues Section- Feature die neue MDATA-Section, um Dokument-Metadaten separat zu handhaben. Generell ist eine Section Suche nur sinnvoll, wenn das Dokument eine interne Struktur (Section) wie HTML oder XML besitzt. Bei MDATA wird der Metadaten-Anteil separat als strukturierter Anteil gespeichert und ist für den Text-Index unsichtbar. So könnte eine MDATA-Section folgendermaßen hinzugefügt werden: exec ctx_ddl.add_mdata_ section(group_name=>ʼmysegʼ, section_name=>ʼauthorʼ, tag=>ʼauthorʼ); Die MDATA-Section wird dabei nicht tokenized, kann allerdings verändert werden, ohne das gesamte Dokument zu synchronisieren. Metadaten können hinzugefügt und gelöscht werden, ohne das ganze Dokument zu reindizieren. Die Abfragen können dann mit dem MDATA-Operator auf Gleichheit hin durchgeführt werden und sehen folgendermaßen aus:... where contains(text, mdata(author, William Shakespeare)ʼ)>0 Dieses Section Feature ist in 11g um die sogenannte SDATA-Section erweitert worden, um beispielsweise eine Bereichssuche zuzulassen. Dies zu erläutern, würde allerdings den Rahmen des Beitrags sprengen. Darüber hinaus ist der Composite Domain Index (CDI) neu eingeführt worden, um speziell bei der Optimierung von Mixed Queries unabhängig von den Section-Features zu unterstützen. Ein Composite-Domain-Index ist dabei ein zusammengesetzter Index, der aus mehr als einer Spalte besteht und mit einem einzigen Aufruf an die Text-Engine ausgeführt werden kann. Folgendes Beispiel illustriert einen Anwendungsfall einer typischen Mixed Query: SELECT * WHERE contains(text,ʻreuterʻ)>0 AND ort=ʻfrankfurtʻ Vor 11g wären folgende zwei Indizes als mögliche Zugriffsstruktur möglich: CREATE INDEX i_ort ON comp(ort); CREATE INDEX i_text ON comp(text) INDEXTYPE IS ctxsys.context; Diese könnten folgenden Ablauf bei der Ausführung der Abfrage zur Folge haben: 56 www.doag.org
Abbildung 1: Ansicht eines Ausführungsplans einer Mixed Query im SQL Developer Abbildung 2: Ansicht eines Ausführungsplans einer Mixed Query mit CDI im SQL Developer Suche Reuter im Textindex Erhalte ROWID für jeden Treffer Für jede Trefferzeile aus dem Textindex: Prüfung der ORT-Spalte (Tabellen Lookup oder mit Index) Der Ausführungsplan in Abbildung 1 illustriert den Ablauf. In 11g führt folgende Definition eines Composite-Domain-Indizes zu einem einzigen Aufruf an die Text-Engine: CREATE INDEX cdi_index ON comp(text) INDEXTYPE IS CTXSYS.CONTEXT FILTER BY ort, monat ORDER BY datum; Oracle Text wird nun die Daten aus ORT und MONAT im Text-Index speichern; dabei besteht keine Notwendigkeit, die Queries anzupassen. Der Optimizer wird feststellen, dass die Abfrage durch den Text-Index allein verifiziert werden kann. Die Erweiterung mit ORDER BY führt sogar dazu, dass die abgerufenen Zeilen danach sortiert ausgeliefert werden. Im Unterschied zu B*Tree Indizes können allerdings nur die Informationen gefiltert werden, die auch schon synchronisiert worden sind. Der Ausführungsplan in Abbildung 2 zeigt den Einsatz des Composite-Domain- Index. Mehr Funktionalität am Beispiel des Scoring-Features Um ein Ranking (Scoring) für Dokumente in einer Abfrage zu erhalten, nutzt Oracle Text als Standard den inversen Häufigkeits-Algorithmus, basierend auf Salton. Um Relevanzbezogene Abfragen auf Ergebnislisten durchzuführen, wird der Operator SCORE verwendet. Dabei kann auch eine Gewichtung durchgeführt werden, um das Ergebnis zu beeinflussen. Folgendes Beispiel illustriert die Gewichtung und den Einsatz des SCORE Operators: SELECT score(1), text WHERE contains(text, ʻReuter OR Test*3ʼ, 1) >0 ORDER BY score(1) Scoring nach der inversen Dokumenthäufigkeit bedeutet, dass häufiges Vor- Abbildung 3: Beispiele um den Scoring-Wert von 100 zu erreichen DOAG News Q3-2008 57
Datenbanken kommen eines Begriffes in Dokumenten zu einem niedrigen Scoring-Wert führt. Damit der Scoring-Faktor hoch ist, muss ein Begriff häufig im Dokument selbst, allerdings zusätzlich selten in allen Dokumenten insgesamt vorkommen. Der Ausschnitt aus dem Handbuch (Abbildung 3) zeigt an einem Beispiel wie der Scoring-Wert von Oracle Text funktioniert. Um dieses Scoring-Verhalten neu zu definieren beziehungsweise Benutzer definiert zur Verfügung zu stellen, stehen ab 11g die Operatoren DEFINESCORE und DEFINEMERGE zur Verfügung. Dabei können dem Suchbegriff folgende Scoring-Ausdrücke und Funktionen zugeordnet werden: Discrete Occurrence Relevance Completion Ignore LOG, ABS und Rechenoperationen () für Gruppierung Folgende Beispiele demonstrieren die Verwendung: SELECT dok_id, text, score(1) WHERE contains(text,ʻdefinescore (Umfrage,occurrence)ʻ, 1)>0 AND score(1)=7 ORDER BY score(1) Es werden die Dokumente ausgegeben, die im Text ein siebenmaliges Vorkommen des Begriffs Umfrage enthalten. Die Scoring-Ausdrücke lassen sich dabei auch gewichten. Das nächste Beispiel gibt die DOK_ IDs und das Scoring der Dokumente aus, deren Scoring-Relevanz mit 5 gewichtet ist. SELECT dok_id, score(1) WHERE contains(text, DEFINESCORE (Umfrage, RELEVANCE*5),1)>0 Ergänzend dazu liefert der DEFINEMERGE-Operator die Möglichkeit, das Scoring von Termen mit AND und OR Abbildung 4: Text Manager im Enterprise Manager 58 www.doag.org Ausdrücken zu definieren. Folgendes Beispiel zeigt dessen Verwendung:... contains(text, DEFINEMERGE ( ((DEFINESCO RE(Umfrage,DISCRETE)), (Zinsen)),AND,MAX)ʻ,1)>0 Für den Suchbegriffe Umfrage wird der DISCRETE Scoring-Algorithmus verwendet das bedeutet 0 bei keinem Vorkommen und 100 bei mindestens einem Vorkommen. Für den Suchbegriff Zinsen wird der Standard-Relevanz-Scoring-Algorithmus verwendet. Von beiden wird das Maximum als sogenannter Merged Score ausgegeben. Manageability Informationen über den Text-Index beziehungsweise über seine Statistiken ist seit jeher mit den entsprechenden Data-Dictionary-Tabellen wie CTX_INDEX_ERRORS, CTX_PENDING etc. oder mit Packages wie CTX_REPORT möglich, die zum Beispiel Skripte
und Berichte über den Index oder Statistiken zu den Abfragen und Tokens liefern. Bei 11g existiert ein Text-Manager-Bereich im Enterprise Manager, mit dem laut Handbuch Basis-Operationen, Konfigurationen und Monitoring durchgeführt werden können. Folgende Operationen sind verfügbar: Synchronize Optimize Rebuild Resume Failed Operation Show Logs Show Errors Eine Index-Erzeugung ist allerdings nicht möglich. Der Screenshot in Abbildung 4 zeigt einen Ausschnitt aus der Index-Statistik-Page. Soll zum Beispiel schnell nachgeprüft werden, wie der Index erzeugt worden ist, kann der Text Manager weiterhelfen: Ein einfacher Klick auf den Buton Download Index Creation Script generiert automatisch das CREATE INDEX-Skript sowie die zugehörigen Preferences. Jetzt wird auch die Nutzung des Text-Index, der Text-Packages oder der Text-Operatoren nun in Bezug auf Oracle Text mit aufgezeichnet. Dazu kann einfach die View DBA_FEATURES_USAGE_STA- TISTICS selektiert werden (siehe Listing unten). Erhöhung der Verfügbarkeit Heutzutage müssen auch Anwendungen mit Oracle Text-Indizes hochverfügbar sein. Ein Neuaufbau (REBUILD) des Index kann dazu führen, dass der Index nicht mehr online zur Verfügung steht. Der Neuaufbau kann aus mehreren Gründen nötig werden. Spezielle Index-Preferences bzw. -Optionen wie Lexer-Einstellungen sollen geändert werden oder Stoppwörter hinzugefügt werden Aus Maintenance- und Performance- Gründen soll der Index neu aufgebaut werden, um etwa stark vergrößerte $I-Tabelle zu optimieren Ein Index-REBUILD ist bis einschließlich 10g nicht immer vollständig online möglich. Eine mögliche Lösung für diese Tatsache ist, einen zusätzlichen zweiten Schatten-Index zu erzeugen und diesen mitzupflegen. Die Tabelle könnte dabei folgendermaßen aussehen: CREATE TABLE mytable ( text CLOB, dummy1 CHAR, dummy2 CHAR); Da nur ein einziger Text-Index auf einer Spalte möglich ist, wird die Indizierung über den Einsatz von USER_DATA_STORE beziehungsweise MULTI_COLUMN_DATATORE gelöst. Diese erlauben es, einen Index auf der Spalte DUMMY1 zu erzeugen, aber die aktuellen zu indizierenden Daten werden von einer anderen Spalte wie etwa TEXT geliefert. Die Abfragen sehen folgendermaßen aus:... WHERE CONTAINS (dummy1, <suchbegriff>ʻ) > 0 Im Falle eines Neuaufbaus steht die Spalte DUMMY2 zur Verfügung, die ihre Daten ebenfalls aus der Spalte TEXT erhält. Falls der Aufbau beendet ist, müssen die Queries folgendermaßen geändert werden:... WHERE CONTAINS (dummy2, <suchbegriff>ʻ) > 0 SELECT name, last_usage_date, feature_info, description FROM dba_feature_usage_statistics WHERE description LIKE %Text%ʻ NAME LAST_USAG ---------------------------------------------------------------- --------- FEATURE_INFO ------------------------------------------------------------------------------ DESCRIPTION ------------------------------------------------------------------------------ Oracle Text 05-JUN-08 <text_usage> <package_usage> <package name= CTX_ADM used= T />... <package name= CTX_OUTPUT used= F /> <package name= CTX_QUERY used= F /> </package_usage> <index_usage> <index_type name= CONTEXT index_count= 1 />... </sql_operator_usage> </text_usage> Oracle Text is being used - there is at least one oracle text index DOAG News Q3-2008 59
Datenbanken Abbildung 5: Text Manager im Enterprise Manager In 11g ist es nun möglich, ein vollständiges REBUILD online durchzuführen entweder in einem Ein-Schritt-Verfahren oder, um mehr Kontrolle zu gewährleisten, als mehrstufiger Prozess. Die Idee dabei ist der Einsatz eines Schatten-Index (auch Shadow-Index), der parallel zum ursprünglichen Index-Aufbau mit aufgeführt wird. Das Einschritt-Verfahren lautet dann folgendermaßen: CTX_DDL.RECREATE_INDEX_ONLINE (idx_name=>ʼi_textʼ,parameter_ string=>ʼreplace LEXER my_new_ lexerʼ) Das kontrollierte Zweischritt-Verfahren hingegen legt zuerst explizit einen Shadow-Index an und erlaubt einen kontrollierten Wechsel (EXCHANGE) zu diesem. Folgendes Beispiel erläutert das Vorgehen: CTX_DDL.CREATE_SHADOW_INDEX (idx_name=>ʻi_textʻ,parameter_ string=>ʻreplace LEXER my_new_ lexerʻ); CTX_DDL.EXCHANGE_SHADOW_INDEX (idx_name=>ʼi_textʼ[,partition_ name => ʻpartnameʼ] ); Darüber hinaus ist es möglich, einen leeren Index mit NOPOPULATE anzulegen, explizit die ROWIDs zum Indizieren in der dr$pending Tabelle 60 www.doag.org abzulegen und danach den Synchronisierungsprozess inkrementell durchzuführen. Der Vorgang könnte dann folgendermaßen aussehen: 1. Einen leeren Index anlegen: CREATE INDEX i_text ON comp(text) indextype is ctxsys. context PARAMETERS ( NOPOPULATEʻ); 2. ROWIDs in der Tabelle dr$pending zur Verfügung stellen: CTX_DDL.POPULATE_PENDING(idx_ name=>ʼi_textʼ, part_ name=>ʼpartitionsnameʼ); Weitere Informationen Um den Umfang des Artikels nicht zu sprengen, sind nur einige Features aus dem Bereich Oracle Text angesprochen. Anzumerken bleibt, dass Oracle Text natürlich auch in Kombination mit den anderen neuen DatenbankFeatures aus dem Bereich Securefile, Compression oder XML genutzt werden kann. Hinweise auf vollständige und weiterführende Informationen sind zum Beispiel hier zu finden: 3. Sync Prozess des Index in einem vorgegebenen Zeitrahmen starten: CTX_DDL.SYNC_INDEX (idx_ name=>ʼi_textʼ, maxtime=>2); Monitoren lässt sich das Ganze im Enterprise Manager, wie in Abbildung 5 zu sehen ist. Erfolgt nun eine Text-Abfrage auf die Text-Spalte mit dem Text-Index I_TEXT werden in folgendem Beispiel 7973 Dokumente von insgesamt 147406 Dokumenten berücksichtigt, da nur diese bisher erfolgreich synchronisiert wurden. Die restlichen Dokumente können kontrolliert zu einem späteren Zeitpunkt nach und nach synchronisiert werden, wenn zusätzliche Last dies erlaubt. Oracle Text (White Paper June 2007): http://www.oracle.com/ technology/products/text/ pdf/11goracletexttwp.pdf New Features in Oracle Text with Oracle Database 11g Release 1 (White Paper May 2007): http://www.oracle.com/technology/products/text/pdf/ot11g_new_ features.pdf Oracle TEXT Tipps, Tricks, Best Practice Blog: http://oracle-text-de.blogspot.com/ Vollständige Liste der neuen Features im Oracle Text Reference 11g Release (11.1): http://download.oracle.com/docs/ cd/b28359_01/text.111/b28304/ whatsnew.htm Kontakt: Ulrike Schwinn ulrike.schwinn@oracle.com