prog:oracle_text_highlight
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
prog:oracle_text_highlight [2016/04/24 21:48] – [Oracle Text - Die Treffer einer Oracle Volltext Abfrage in der Ergebnismenge optisch hervorheben] gpipperr | prog:oracle_text_highlight [2016/05/11 19:41] (aktuell) – [Oracle 12c New Feature - Forward Indexing] gpipperr | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | =====Oracle Text - Die Treffer einer Oracle Volltext Abfrage in der Ergebnismenge optisch hervorheben==== | ||
+ | |||
+ | **Ab 10g/ | ||
+ | |||
+ | |||
+ | Einführung in Oracle Text => [[dba: | ||
+ | |||
+ | Nach dem ein Dokument mit einer Volltext Suche gefunden wurde, stellt sich natürlich die Frage, wo denn im Text etwas erkannt wurde. | ||
+ | |||
+ | Für die Aufbereitung der Trefferliste/ | ||
+ | |||
+ | |||
+ | Für einzelne Textabschnitt kann mit " | ||
+ | |||
+ | Ab 12c kann mit Forward Indexing das ganze auch noch beschleunigt werden, allerdings wird dann auch mehr Speicherplatz in der Datenbank benötigt. | ||
+ | ==== Teilbereiche aus dem Dokument mit dem gefundenen Wort hervorheben ==== | ||
+ | |||
+ | So kann zum Beispiel mit " | ||
+ | <code sql> | ||
+ | |||
+ | --Session so setzen wie die Spalte in der Tabelle gefunden werden soll | ||
+ | --Fehlt das, siehe folgender Fehler | ||
+ | |||
+ | exec ctx_doc.set_key_type(' | ||
+ | |||
+ | -- Abfragen und Ergebniss mit ermitteln | ||
+ | |||
+ | select CTX_DOC.SNIPPET( | ||
+ | index_name => ' | ||
+ | , | ||
+ | , | ||
+ | , | ||
+ | , | ||
+ | , | ||
+ | from texte where contains(text, | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | Leider klappt das dann nicht, weil im ersten Test das setzen von " | ||
+ | <fc # | ||
+ | < | ||
+ | ERROR at line 1: | ||
+ | ORA-29903: error in executing ODCIIndexFetch() routine | ||
+ | ORA-20000: Oracle Text error: | ||
+ | DRG-50857: oracle error in drvdoc.get_rowid | ||
+ | ORA-01410: invalid ROWID | ||
+ | ORA-06512: at " | ||
+ | ORA-06512: at " | ||
+ | ORA-06512: at line 1 | ||
+ | </ | ||
+ | |||
+ | Wird nur mit ID auf die PK Spalte verwiesen erhalten wir den folgenden Fehler: | ||
+ | |||
+ | <code sql> | ||
+ | ERROR at line 1: | ||
+ | ORA-20000: Oracle Text error: | ||
+ | DRG-10826: no document with the specified textkey is found | ||
+ | ORA-06512: at " | ||
+ | ORA-06512: at " | ||
+ | ORA-06512: at line 1 | ||
+ | </ | ||
+ | |||
+ | Hier lag der Fehler im falschen CTX Index Namen, gab mehrere davon .-(. | ||
+ | |||
+ | |||
+ | ===Wie muss das nun ohne Fehler aufgerufen werden?=== | ||
+ | |||
+ | |||
+ | Der Parameter **" | ||
+ | |||
+ | Ist der PK aus mehreren Werten zusammengesetzt, | ||
+ | |||
+ | Warum aber funktioniert das in den obigen Beispiel erst mal einfach nicht? | ||
+ | |||
+ | **Lösungsmöglichkeiten: | ||
+ | * Überprüfen, | ||
+ | |||
+ | * Überprüfen, | ||
+ | * exec ctx_doc.set_key_type(' | ||
+ | * exec ctx_doc.set_key_type(' | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== Das ganze Dokument als Text mit Markierung anzeigen ==== | ||
+ | |||
+ | |||
+ | Hilfsfunktion zum Anzeigen eines ganzen Dokumentes: | ||
+ | |||
+ | <code sql> | ||
+ | create or replace function ctx_apex_markup ( p_pk varchar2 | ||
+ | , p_queryString varchar2 | ||
+ | , p_index_name | ||
+ | ) | ||
+ | return clob | ||
+ | is | ||
+ | -- temporären Lob für das Ergebnis | ||
+ | v_storage clob; | ||
+ | begin | ||
+ | -- Wie soll der Parameter Text Key ausgewertet werden! | ||
+ | | ||
+ | |||
+ | -- Markup Funktion in Memory nützen | ||
+ | | ||
+ | , | ||
+ | , | ||
+ | , | ||
+ | , | ||
+ | , | ||
+ | |||
+ | | ||
+ | |||
+ | end ctx_apex_markup; | ||
+ | / | ||
+ | </ | ||
+ | Das Clob Dokument muss natürlich von der rufenden Umgebung auch verarbeitete werden können, ab 32K muss hier also noch etwas mehr getan werden. | ||
+ | |||
+ | Möchte man die Starttag/ | ||
+ | |||
+ | Bei kurzen Texten klappt das aber so ganz gut: | ||
+ | <code sql> | ||
+ | select ctx_apex_markup( | ||
+ | p_index_name | ||
+ | , p_pk => to_char(ID) | ||
+ | , p_queryString | ||
+ | ) | ||
+ | as text | ||
+ | from texte where contains(text, | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | ==== Oracle 12c New Feature - Forward Indexing ==== | ||
+ | |||
+ | Um das Higlighting, | ||
+ | |||
+ | Parameter setzen: | ||
+ | <code sql> | ||
+ | exec ctx_ddl.create_preference(' | ||
+ | |||
+ | exec ctx_ddl.set_attribute | ||
+ | exec ctx_ddl.set_attribute | ||
+ | |||
+ | </ | ||
+ | |||
+ | siehe auch [[dba: | ||
+ | |||
+ | |||
+ | <fc # | ||
+ | |||
+ | Cursor von CTX_DOC.SNIPPET werden nicht geschlossen - ORA-01000: maximum open cursors exceeded | ||
+ | |||
+ | Bug 20892798 : MANY CURSORS OPENED WHEN USING FORWARD INDEXING LEADING TO ORA-01000 ERROR | ||
+ | |||
+ | |||
+ | Kein FIX öffentlich – Falls gleicher Fehler Auftritt erneuten Bug mit Prio eröffnen und Druck machen! | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | ==== Quellen ==== | ||
+ | |||
+ | Oracle Doku: | ||
+ | |||
+ | * CTX_DOC Package => https:// | ||
prog/oracle_text_highlight.txt · Zuletzt geändert: 2016/05/11 19:41 von gpipperr