Oracle
TEXT ist eine in die Datenbank integrierte Volltextrecherche, die in
allen Datenbankeditionen enthalten ist (kostet also nichts extra) und
normalerweise ohne weitere Installation direkt zur Verfügung
steht. Man kann in einem "normalen" Datenbankschema also sofort
starten. Und da die meisten Oracle-Anwender oder Entwickler Oracle TEXT
noch nicht kennen, wollen wir nun genau dies tun:
Das folgende SQL-Skript erzeugt eine Tabelle, fügt ein paar
(kleine) "Dokumente" ein, erzeugt den Volltextindex und zeigt, wie man
darin (sogar linguistisch) suchen kann ...
Zunächst: Tabelle anlegen und füllen - als
"Dokumente" haben wir ein paar "Schlagzeilen" generiert ...
drop table texttabelle / drop sequence seq_texttabelle / create table texttabelle( id number(10), dokument clob ) / create sequence seq_texttabelle / insert into texttabelle values (seq_texttabelle.nextval, 'A-Partei gewinnt Wahl in Hansestadt'); insert into texttabelle values (seq_texttabelle.nextval, 'Terror in Nahost: Kriminalität steigt immer weiter an'); insert into texttabelle values (seq_texttabelle.nextval, 'Wirtschaft: Erneuter Gewinnzuwachs in diesem Jahr'); insert into texttabelle values (seq_texttabelle.nextval, 'Olympia rückt näher: Der Fackellauf ist in vollem Gange'); insert into texttabelle values (seq_texttabelle.nextval, 'Wer wird US-Präsident? Obama und Clinton machen Wahlkampf'); insert into texttabelle values (seq_texttabelle.nextval, 'Papst bestürzt über jüngsten Skandal!'); insert into texttabelle values (seq_texttabelle.nextval, 'Wahlkampf in den USA geht weiter: Clinton und Obama LIVE zu sehen'); insert into texttabelle values (seq_texttabelle.nextval, 'Software-Kenntnisse werden immer wichtiger'); insert into texttabelle values (seq_texttabelle.nextval, 'Umfrage: Alle wollen mehr Geld!'); insert into texttabelle values (seq_texttabelle.nextval, 'Der Papst liest seine erste Messe in den USA!'); commit /
Nun wird der Index erzeugt ...
create index idx_text on texttabelle (dokument) indextype is ctxsys.context /
Fertig. Nun kann man suchen ... und das geht wie folgt:
-
Die einfachste Variante: Suche nach einem Wort:
SQL> select * from texttabelle where contains(dokument, 'Papst')>0; ID DOKUMENT ---------- --------------------------------------------------------------- 6 Papst bestürzt über jüngsten Skandal! 10 Der Papst liest seine erste Messe in den USA! 2 Zeilen ausgewählt.
- Boole'sche Operatoren wie AND, OR, NOT gehen natürlich auch ...
SQL> select * from texttabelle where contains(dokument, 'Papst and Skandal')>0; ID DOKUMENT ---------- --------------------------------------------------------------------------- 6 Papst bestürzt über jüngsten Skandal! 1 Zeile wurde ausgewählt.
- Nun
wird's interessant: Wir suchen
Dokumente, in denen jemand etwas "liest" ... und das kann sprachlich ja
unterschiedlich aussehen ... (lesen, las, liest, gelesen, ...). Dazu
gibt es in Oracle TEXT eine Wortstammsuche ...
SQL> select * from texttabelle where contains(dokument, '$lesen')>0; ID DOKUMENT ---------- ------------------------------------------------------------------------ 10 Der Papst liest seine erste Messe in den USA! 1 Zeile wurde ausgewählt.
- Oracle
TEXT ist übrigens
auch noch fehlertolerant ... wenn man den Fuzzy-Operator verwendet
... Suchen wir mal nach dem USA-"Wahlkrampf":
SQL> select * from texttabelle where contains(dokument, '?Wahlkrampf')>0; ID DOKUMENT ---------- ------------------------------------------------------------------------ 5 Wer wird US-Präsident? Obama und Clinton machen Wahlkampf 7 Wahlkampf in den USA geht weiter: Clinton und Obama ... 2 Zeilen ausgewählt.
- Ein
(vorerst) letztes Beispiel: Zwei
Wörter sollen nah beeinander stehen ("nah" meint hier: es darf
nur ein Wort dazwischen stehen):
SQL> select * from texttabelle 2 where contains(dokument, 'NEAR((Clinton, Wahlkampf),2)')>0; ID DOKUMENT ---------- -------------------------------------------------------------------------------- 5 Wer wird US-Präsident? Obama und Clinton machen Wahlkampf 1 Zeile wurde ausgewählt.
Am
besten probiert man es einfach mal aus ...
mehr zum Thema kommt in Kürze ...