Donnerstag, 10. Juli 2008

Keyword in Context: CTX_DOC.SNIPPET

Die Ergebnisse einer Volltextabfrage mit CONTAINS lassen sich ab Oracle 10.2 ganz einfach als "Keyword in Context" wie in gängigen Suchmaschinen darstellen. Dazu gibt es die Funktion CTX_DOC.SNIPPET.
Als Ausgangpunkt nehmen wir wieder das Beispiel aus dem ersten Posting. Allerdings sind diese Texte noch etwas kurz, so dass es keinen Sinn machen würde, etwas auszuschneiden. Wir fügen also noch zwei etwas längere Texte hinzu ...

insert into texttabelle values (seq_texttabelle.nextval, '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 ... ');
insert into texttabelle values (seq_texttabelle.nextval, 'Werden zusätzliche Dokumente in unsere Dokumenttabelle eingefügt, wird der Index nicht automatisch aktualisiert. Um den Index up-to-date zu haben, muss der Index synchronisiert werden. Dies kann man manuell mit der Prozedur CTX_DDL.SYNC_INDEX erreichen oder aber automatisch in periodischen Abständen in Verbindung mit dem DBMS_JOB oder ab 10g mit dem DBMS_SCHEDULER Paket. In 10g ist es nun zusätzlich möglich diese Operation ganz bequem beim CREATE INDEX oder dem ALTER INDEX REBUILD PARAMETERS mitanzugeben. In folgendem Beispiel wird der Sync-Scheduler-Job alle 5 Minuten durchgeführt; dabei wird 15MB Memory zur Verfügung gestellt und mit der Parallelisierung von 2 gearbeitet.');

COMMIT nicht vergessen und dann noch den Index synchronisieren ...
SQL> commit;

Transaktion mit COMMIT abgeschlossen.

SQL> exec ctx_ddl.sync_index('IDX_TEXT');

PL/SQL-Prozedur erfolgreich abgeschlossen.
Und nun fragen wir mal ab ...
select 
  id, 
  ctx_doc.snippet(
    'IDX_TEXT',
    rowid,
    'Entwickler'
  ) snippet,
  score(0) score
from texttabelle
where contains (dokument, 'Entwickler',0) > 0
/

        ID SNIPPET                                                           SCORE
---------- ------------------------------------------------------------ ----------
        11 Und da die meisten Oracle-Anwender oder <b>Entwickler</b> Or          6
           acle TEXT noch nicht kennen, wollen wir
Man sieht also bei größeren Dokumenten sofort den Textbereich, in dem das Schlüsselwort sich befindet - der Endanwender kann wesentlich besser beurteilen, ob der Treffer passt ... eben wie bei gängigen Suchmaschinen.
Wenn man weiter keine Angabe macht, wird das Suchwort (Keyword) mit dem HTML-Tag <b> und </b> umschlossen; mit den Parametern STARTTAG und ENDTAG kann dies aber konfiguriert werden; man kann das Ergebnis der Funktion also direkt für die Web-Ausgabe vorbereiten. Natürlich sind auch einfache Begrenzungen wie | oder * möglich ...
Wenn ein Suchwort mehrfach im Dokument vorkommt, gibt es auch mehrere Snippets. Die Snippets werden dann standardmäßig durch drei Punkte (...) getrennt; auch dies kann mit dem Parameter SEPARATOR konfiguriert werden.

Beliebte Postings