Die Funktion CTX_QUERY.BROWSE_WORDS ist sehr hilfreich, wenn
es darum geht, "sich im Textindex" umzusehen. So kann man damit bspw. die
aus dem Internet bekannte "Meinten Sie ...?"-Funktion umsetzen.
BROWSE_WORDS ist hier dokumentiert. Ausgehend von einem Start-Token sucht die Funktion die alphabetisch "danach" oder "davor" kommenden Tokens aus dem Index heraus. Liefert eine Textabfrage also nur wenige Ergebnisse zurück, so kann man mit dieser Funktion Suchvorschläge machen; könnte ja sein, dass der Anwender sich einfach nur vertippt hat. Das "Start-Token" kann, muss aber nicht im Index enthalten sein.
Hier ein Beispiel: Rund um das "Start-Token" XDBADNIN (Tippfehler) werden nun
10 Tokens herausgesucht ...
set serveroutput on; declare v_resarr ctx_query.browse_tab; begin ctx_query.browse_words( index_name => 'ftx_scripts', seed => 'XDBADNIN', resarr => v_resarr, numwords => 10, direction => CTX_QUERY.BROWSE_AROUND ); for i in 1..v_resarr.count loop dbms_output.put_line( rpad(v_resarr(i).word, 45) || ':' || lpad(v_resarr(i).doc_count, 3) ); end loop; end; /
Die Ausgabe ist dann wie folgt ...
XDB1M102 : 2 XDB3G65V2HGYFNY6SPJQOPJZUK6YG : 1 XDB7A24C : 1 XDBACL : 1 XDBADMIN : 18 XDBAPP : 1 XDBBRNNM6W5FHBEMZV5PCLLGABJNO7Z6BJL22DCN : 1 XDBCONFIG : 23 XDBCORE : 4 XDBDBMIG : 8
Gut zu erkennen ist, dass zusätzlich auch noch die Anzahl der Dokumente, in denen
das jeweilige Token vorkommt, mitgeliefert wird. Man könnte in dieser Liste also das
Token mit dem höchsten Document Count heraussuchen und dem Endanwender vorschlagen ...
Wichtig bei meinen Tests mit der Funktion war die Einstellung von NLS_SORT - für
diese Funktion sollte es auf BINARY stehen (sonst werden die Tokens "vorher" nicht richtig
herausgesucht). Wenn eure Anwendung hier mit LINGUISTIC
arbeitet, sollte es für diese Funktion umgestellt werden; NLS_SORT kann mit einem ALTER SESSION
geändert werden. Das folgende Beispiel zeigt, wie man das erreichen kann.
set serveroutput on; declare v_resarr ctx_query.browse_tab; v_nlssort varchar2(4000); begin v_nlssort := sys_context('userenv', 'nls_sort'); dbms_session.set_nls('NLS_SORT', 'BINARY'); ctx_query.browse_words( index_name => 'ftx_scripts', seed => 'XDBADNIN', resarr => v_resarr, numwords => 10, direction => CTX_QUERY.BROWSE_AROUND ); for i in 1..v_resarr.count loop dbms_output.put_line( rpad(v_resarr(i).word, 45) || ':' || lpad(v_resarr(i).doc_count, 3) ); end loop; dbms_session.set_nls('NLS_SORT', v_nlssort); end; /