Wenn man Oracle TEXT in einer Applikation nutzt und Abfragen mit der CONTAINS-Funktion
durchführt, möchte man fast immer auch die Anzahl der Treffer auf der Ergebnisseite anzeigen.
Und der erste, naheliegende Gedanke ist, hierfür ein SELECT COUNT(*) zu verwenden - die
Abfrage findet ja auch mit einem SELECT statt.
select count(*) from dokument_tab where contains(dokument, 'Bundeskanzler') > 0
Gerade bei Oracle TEXT ist diese Variante jedoch sehr ineffektiv - denn die Datenbank
muss hierfür sowohl auf den Volltextindex als auch auf die Tabelle zugreifen. Besser
ist es, die dafür vorgesehene Funktion COUNT_HITS im PL/SQL-Paket CTX_QUERY zu nutzen.
set serveroutput on declare v_number number; begin v_number := ctx_query.count_hits( index_name => 'MY_FULLTEXT_IDX', text_query => 'oracle and text', exact => true ); dbms_output.put_line('Anzahl Treffer: '||v_number); end; / Anzahl Treffer: 2657
Man muss den Namen des Index kennen, um die Funktion nutzen zu können; mit
der Dictionary View CTX_USER_INDEXES ist dieser aber leicht zu ermitteln. Interessant ist noch der
Parameter exact - gibt man hier false an, so arbeitet die Funktion
schneller, dafür ungenauer: Seit der letzten Indexoptimierung gelöschte und veränderte
Dokumente werden dann nicht berücksichtigt; der Wert ist also zu hoch. Direkt nach einer
Indexoptimierung liefern sowohl exact => true als auch exact => false
gleiche Ergebnisse zurück. In allen Fällen ist CTX_QUERY.COUNT_HITS schneller
als ein SELECT COUNT(*).
Mehr Information in der Oracle Dokumentation - TEXT Reference.