Inhaltsverzeichnis
Einen Oracle Text Theme Index aufbauen
Min ab Oracle 8i
Für eine generelle Einführung in Oracle Text siehe hier ⇒ Oracle Text - Volltext Suche über Text Dokumente
Mit Hilfe eines Theme Indexe lässt sich der Inhalt eines Dokumentes besser verstehen, über ein Regelwerk schließen wir auf die ungefähre Bedeutung des Dokuments.
Allerdings benötigen wir für eine solche Analyse ein entsprechendes Regelwerk, eine Ontologie (Kowledge base, hierarchical tree of concepts used for theme indexing) wie einen Thesaurus, der die Beziehungen unter den Wörtern beschreibt.
Für die Englisch und Französisch Sprache liegt zwar einiges bereits vor, für Deutsch muss aber erst ein Regelwerk aufgestellt werden.
Um ein eigenes Regelwerk aufzustellen, siehe dazu ⇒ mit einem Thesaurus und Oracle Text arbeiten.
Automatisch wird nur ein Theme Index angelegt, wenn NLS_LANG auf „American“ in der Umgebung und in der Datenbank steht!
Für den Theme Index wird ein Oracle Context Index mit einer Eigenschaft für den Lexer INDEX_THEMES angelegt.
Der große Nachteil an diesen Index ist die große Ungewissheit, ob die Datenbank das Dokument wirklich analysiert und die richtige Ontologie/Thesaurus in der richtigen Sprache auch angewandt hat.
Die Spracheinstellung werden über die Laufzeitumgebung und die DB Einstellungen gesteuert!
Sollen mehrsprachige Dokumente verarbeitet werden kann mit dem MULTI_LEXER oder mit dem WORLD_LEXER gearbeitet werden.
In den ersten Test konnte die Ergebnisse daher nicht ohne weiteres nachvollzogen werden.
Vorbereitung - Oracle Text Knowledge Base überprüfen
Die Oracle Text Knowledge Base liegt unter $ORACLE_HOME\ctx\data.
Tritt der folgende Fehler auf:
DRG-11422: linguistic initialization failed DRG-11446: supplied knowledge base
Dann Liegen hier die Daten und Verzeichnisse hier nicht vor!
Vor Oracle 12c lassen sich die Daten auf der Companion CD mit den Demos und Beispielen finden, einfach die ctx\data Stuktur kopieren.
Dokumenten Store anlegen
In meine Fall verbleiben die Dokumente auf der Festplatte, daher wird der Datentyp BFILE zum Speichern eines Verweises auf die Dateien gespeichert.
CREATE TABLE documents ( id NUMBER(11) , docs BFILE , CONSTRAINT DOCUMENTS_PK PRIMARY KEY (ID) ) / INSERT INTO documents VALUES (1, BFILENAME('INFO_ARCHIVE', 'linux_805.pdf')); commit; --
Immer darauf achten, das die Dokumenten Tabelle auch einen Primary Key hat!
Oracle Text Index mit der Lexer Eigenschaft INDEX_THEMES anlegen
Der Lexer ist für den Aufbau eines Context Indexe mit Theme Daten zuständig.
Zuvor die Eigenschaften des LEXER definieren:
-- Theme Index mit anlegen EXEC ctx_ddl.create_preference( 'gpi_lexer', 'BASIC_LEXER' ); EXEC ctx_ddl.set_attribute ('gpi_lexer', 'INDEX_THEMES', 'YES');
Index erzeugen:
CREATE INDEX idx_documents_docs ON documents(docs) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('FILTER CTXSYS.AUTO_FILTER LEXER gpi_lexer') / --prüfen ob ein Fehler bei Indizieren aufgetreten ist: SELECT * FROM CTX_USER_INDEX_ERRORS; --Neben dem normalen Tockens werden nun die Themen Token vom Typ 1 abgelegt: SELECT token_type FROM dr$idx_documents_docs$i GROUP BY token_type; TOKEN_TYPE ------------ 0 => Normale Tocken #Problem --> es funktioniert nicht immer! 1 => Themes
Problem: Theme Index wird nicht mit Werten gefüllt
Damit das ganze funktioniert muss strikt auf die Sprache Einstellungen geachtet werden.
Das ganze funktioniert in den Beispielen nur wenn alles auf Englisch konfiguriert ist!
Zum ersten Test die DB auf umstellen:
sqlplus / AS sysdba ALTER system SET nls_language='AMERICAN' scope=spfile sid='*'; ALTER system SET nls_territory='AMERICA' scope=spfile sid='*'; startup force
Im ersten Schritt hat das allerdings auch nicht den gewünschten Effekt gebracht…
NLS_LANG Variable der SQL*Plus Session, die den Index anlegt muss auch auch auf Englisch stehen!
SET NLS_LANG=AMERICAN_AMERICA.UTF8 sqlplus gpi/gpi
Nun wird der Index auch angelegt.
Zum Prüfen welche Dateien er jezt wirklich für den Theme Index verwendet das Verzeichnis $ORACLE_HOME\ctx\data umbennen in $ORACLE_HOME\ctx\_data und den Index erneut anlegen
Über die Fehlermeldung lässt sich erkennen wo der Indexer sucht:
CREATE INDEX idx_documents_docs ON documents(docs) * ERROR at line 1: ORA-29855: error occurred IN the execution OF ODCIINDEXCREATE ROUTINE ORA-20000: Oracle Text error: DRG-11422: linguistic initialization failed DRG-11446: supplied knowledge base file D:\oracle\products\12.1.0.2\dbhome_1\ctx\DATA\enlx\droldUS.dat NOT installed ORA-06512: at "CTXSYS.DRUE", line 160 ORA-06512: at "CTXSYS.TEXTINDEXMETHODS", line 366
Was passiert nun wenn alles wieder auf Deutsch steht?
set-item -path ENV:NLS_LANG -VALUE GERMAN_GERMANY.UTF8 sqlplus gpi/gpi CREATE INDEX idx_documents_docs ON documents(docs) -- nun ohne jede Fehermeldung!
D.h. es ist gar nicht so einfach zu erkennen ob nun das ganze wirklich funktioniert oder nicht…..
Themes in eine eigene Tabelle extrahieren
Tabelle anlegen:
CREATE TABLE themes_table ( query_id NUMBER, theme varchar2(2000), weight NUMBER );
Theme Information für das Dokument 1 in die Tabelle schreiben:
BEGIN ctx_doc.themes ( index_name => 'idx_documents_docs' , restab => 'themes_table' , textkey => 1 , full_themes => TRUE ); END; /
Das funktioniert allerdings nur, wenn der Index zuvor auch schon richtig aufgebaut werden konnte.
Eine eigene Ontologie / Knowlege Base / Thesaurus anlegen
Eine Knowlege Base in Oracle Text basiert auf einem bestehenden Thesaurus und wird mit dem ctxkbtc Tool erzeugt.
D.h. das Problem besteht im ersten Schritt darin einen Thesaurus für das zu bearbeitende Thema zu erstellen.
Siehe dazu im Detail ⇒ Mit einem Thesaurus und Oracle Text arbeiten
Siehe auch ⇒ https://docs.oracle.com/database/121/CCAPP/GUID-05C24323-568D-4952-9358-7C98D68B19BF.htm#CCAPP0900 und https://docs.oracle.com/database/121/CCREF/cthes.htm#CCREF1600
Quellen
Demo:
Docu:
Oracle Text Log und Trace anlegen
Um besser zu verstehen wie das Ganze funktioniert einen Trace anlegen mit CTX_OUTPUT.
Dazu:
- Log einschalten mit CTX_OUTPUT.START_LOG(logfile in varchar2, overwrite in default true)
- Logfile liegt unter %ORACLE_HOME%ctx\log\
- Trace für Auto Filter aktivieren mit CTX_OUTPUT.ADD_TRACE(trace_id BINARY_INTEGER)
- Operationen durchführen
- Trace wieder ausschalten
- Log wieder ausschalten mit ctx_output.end_log
Beispiel:
sqlplus / AS sysdba GRANT CTXAPP TO gpi; CONNECT gpi/gpi #Log einschalten BEGIN CTX_OUTPUT.START_LOG('gpi_log_24_01_2016.log'); END; / #2=TRACE_IDX_AUTO_FILTER BEGIN ctxsys.CTX_OUTPUT.ADD_TRACE(trace_id => CTX_OUTPUT.TRACE_IDX_AUTO_FILTER); END; / #Was ist gesetzt überprüfen mit: SELECT * FROM ctx_trace_values; # Was tun DROP INDEX idx_documents_docs; #neu anlegen CREATE INDEX .... #Trace Event wieder entfernen BEGIN ctxsys.CTX_OUTPUT.REMOVE_TRACE(trace_id => CTX_OUTPUT.TRACE_IDX_AUTO_FILTER); END; / #Log wieder ausschalten EXEC ctx_output.end_log
Das Logfile liegt dann unter %ORACLE_HOME%ctx\log\
Siehe auch für die Fehlersuche:
- MOS Node: Oracle Text Product Info Center Diagnostics Master Note (Doc ID 1087143.1)