Beim Erstellen eines Oracle TEXT-Index kann man eine ganze Menge
Einstellungen vornehmen. Im letzten Posting
ging es um das Thema Stopwörter, heute schauen wir uns ein paar andere Einstellungen an.
Wir beginnen ganz einfach und erzeugen zunächst eine Tabelle mit ein paar Textzeilen.
drop table texte / create table texte ( id number, text varchar2(4000) ) / insert into texte values (1, 'Das Treffen am Bahnhofsplatz heute abend war schön'); insert into texte values (2, 'Dem Chat trat der Nutzer "user_7642" bei'); commit /
Erstellen wir nun einen Index - zunächst mal ohne jede Parametrisierung ...
drop index idx_texte / create index idx_texte on texte (text) indextype is ctxsys.context /
Anschließend kann man sich "den Index" mit einem Blick auf die Token-Tabelle ansehen ...
SQL> select token_text from dr$idx_texte$i; TOKEN_TEXT -------------------------------------------------- 7642 Bahnhof Bahnhofsplatz Chat Das Dem Nutzer Platz Treffen abend heute schön trat user
Die erste Auffälligkeit ist die Tatsache, dass die Wörter (Tokens) im Mixed Case
in der Token-Tabelle stehen. Das ist für die meisten Fälle ungeeignet, da eine Suche
nach "chat" (alles kleingeschrieben) zu keinem Ergebnis führen würde. Dies gälte es also
durch Einstellung von Parametern zu ändern.
An anderer Stelle es gut erkennbar, dass der Index die deutsche Sprache erkannt hat;
das Token "Bahnhofsplatz" wurde korrekt in die zusätzlichen Tokens "Bahnhof" und "Platz"
zerlegt. Experimentieren wir nun ein wenig mit den Parametern: Als erstes soll der Index
nicht mehr Case-Sensitiv sein ...
drop index idx_texte / begin ctx_ddl.drop_preference( preference_name => 'MY_LEXER' ); end; / begin ctx_ddl.create_preference( preference_name => 'MY_LEXER', object_name => 'BASIC_LEXER' ); -- Mixed Case abschalten ctx_ddl.set_attribute( preference_name => 'MY_LEXER', attribute_name => 'MIXED_CASE', attribute_value => 'NO' ); end; / create index idx_texte on texte (text) indextype is ctxsys.context parameters ('LEXER MY_LEXER') /
Die Parameter werden in die sog. Preference MY_LEXER eingestellt. Anschließend
wird der Index neu erstellt - die Token-Tabelle sieht dann so aus:
SQL> select token_text from dr$idx_texte$i; TOKEN_TEXT ---------------------------------------------------------------- 7642 ABEND BAHNHOFSPLATZ CHAT HEUTE NUTZER SCHÖN TRAT TREFFEN USER
OK ... damit ist das Mixed-Case-Problem behoben. Allerdings wurde der
Bahnhofsplatz nun nicht mehr zerlegt - und das war ja eigentlich ganz gut so ... Das
Erstellen der Preference MY_LEXER ändern wir also nochmals und schalten die
Kompositazerlegung wieder ein (von nun an stelle ich nur noch die create_preference Aufrufe
hier vor.
begin ctx_ddl.create_preference( preference_name => 'MY_LEXER', object_name => 'BASIC_LEXER' ); -- Mixed Case abschalten ctx_ddl.set_attribute( preference_name => 'MY_LEXER', attribute_name => 'MIXED_CASE', attribute_value => 'NO' ); -- Kompositazerlegung einschalten ctx_ddl.set_attribute( preference_name => 'MY_LEXER', attribute_name => 'COMPOSITE', attribute_value => 'GERMAN' ); end; /
Ergebnis ..
SQL> select token_text from dr$idx_texte$i; TOKEN_TEXT --------------------------------------------------------- 7642 ABEND BAHNHOF BAHNHOFSPLATZ CHAT HEUTE NUTZER PLATZ SCHÖN TRAT TREFFEN USER
Das Token user_7642 wurde offensichtlich ebenfalls zerlegt: Oracle TEXT
behandelt den Unterstrich (_) als Trenner von Tokens. Auch dies kann man mit
dem Parameter PRINTJOINS abschalten ...
begin ctx_ddl.create_preference( preference_name => 'MY_LEXER', object_name => 'BASIC_LEXER' ); -- Mixed Case abschalten ctx_ddl.set_attribute( preference_name => 'MY_LEXER', attribute_name => 'MIXED_CASE', attribute_value => 'NO' ); -- Kompositazerlegung einschalten ctx_ddl.set_attribute( preference_name => 'MY_LEXER', attribute_name => 'COMPOSITE', attribute_value => 'GERMAN' ); -- Den Unterstrich (_) als "Printjoin" deklarieren ctx_ddl.set_attribute( preference_name => 'MY_LEXER', attribute_name => 'PRINTJOINS', attribute_value => '_' ); end; /
Das Ergebnis ...
SQL> select token_text from dr$idx_texte$i; TOKEN_TEXT --------------------------------------------------- ABEND BAHNHOF BAHNHOFSPLATZ CHAT HEUTE NUTZER PLATZ SCHÖN TRAT TREFFEN USER_7642
Doch hierbei Vorsicht: Der Unterstrich wirkt nun überhaupt nicht mehr als Trennzeichen
für Tokens - die Aufnahme eines Zeichens zu den Printjoins sollte also nur dann
erfolgen, wenn man sich sicher ist, dass dies auch für den gesamten Dokumentbestand in Ordnung
geht. Weiterhin könnt Ihr nur einzelne Zeichen als Printjoins deklarieren, keine
Zeichenketten. Hierbei muss man also ein wenig aufpassen ...
Eine andere Variante wäre, den Unterstrich als Skipjoin zu deklarieren ...
begin ctx_ddl.create_preference( preference_name => 'MY_LEXER', object_name => 'BASIC_LEXER' ); -- Mixed Case abschalten ctx_ddl.set_attribute( preference_name => 'MY_LEXER', attribute_name => 'MIXED_CASE', attribute_value => 'NO' ); -- Kompositazerlegung einschalten ctx_ddl.set_attribute( preference_name => 'MY_LEXER', attribute_name => 'COMPOSITE', attribute_value => 'GERMAN' ); -- Den Unterstrich (_) als "Skipjoin" deklarieren ctx_ddl.set_attribute( preference_name => 'MY_LEXER', attribute_name => 'SKIPJOINS', attribute_value => '_' ); end; /
... was dann so aussieht; der Unterstrich wäre dann verschwunden und würde bei
Abfragen ignoriert.
SQL> select token_text from dr$idx_texte$i; TOKEN_TEXT --------------------------------------------- ABEND BAHNHOF BAHNHOFSPLATZ CHAT HEUTE NUTZER PLATZ SCHÖN TRAT TREFFEN USER7642
Eine vollständige Übersicht über alle Parameter (es gibt noch ein paar mehr) findet Ihr
im Handbuch Text Reference. So ... das war's für heute - mehr zu Textindex-Parametern und Einstellungsmöglichkeiten in den
nächsten Postings ...