Benutzer-Werkzeuge

Webseiten-Werkzeuge


dba:oracle_text_index_themes

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

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)
Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
"Autor: Gunther Pipperr"
dba/oracle_text_index_themes.txt · Zuletzt geändert: 2016/04/24 22:15 von gpipperr