prog:oracle_text_contains
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
prog:oracle_text_contains [2017/04/22 16:10] – [Oracle Text - In Texten suchen] gpipperr | prog:oracle_text_contains [2023/11/08 14:11] (aktuell) – [Oracle Text - In Texten suchen] gpipperr | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | =====Oracle Text - In Texten suchen===== | ||
+ | |||
+ | Einführung in Oracle Text => [[dba: | ||
+ | |||
+ | Nach der Indizierung der Daten kann nun in den Daten gesucht werden. Für die Suche steht der CONTAINS Operator zur Verfügung. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | |||
+ | Syntax: | ||
+ | <code sql> | ||
+ | SELECT id | ||
+ | , SCORE(1) | ||
+ | FROM TEXTE | ||
+ | WHERE CONTAINS(column, | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | Mit der SCORE Funktion (die Nummer 1 ist hier die gleiche Nummer wie der dritte CONTAINS Parameter) kann die Relevanz eines Treffers angezeigt werden. | ||
+ | |||
+ | |||
+ | Hier wurde das von Oracle auch mal beschrieben => (Salton' | ||
+ | |||
+ | |||
+ | Der Score ist die [[https:// | ||
+ | |||
+ | |||
+ | Ab Oracle 11 kann das Scoring verhalten beeinflusst werden: | ||
+ | |||
+ | <code sql> | ||
+ | DISCRETE | ||
+ | OCCURRENCE | ||
+ | RELEVANCE | ||
+ | COMPLETION | ||
+ | IGNORE | ||
+ | LOG,ABS und Rechenoperationen () für Gruppierung | ||
+ | |||
+ | wie: | ||
+ | |||
+ | SELECT id | ||
+ | , SCORE(1) | ||
+ | FROM TEXTE | ||
+ | WHERE CONTAINS(column, | ||
+ | / | ||
+ | |||
+ | </ | ||
+ | |||
+ | siehe auch => https:// | ||
+ | |||
+ | |||
+ | |||
+ | ==== Test Daten anlegen ==== | ||
+ | |||
+ | Im ersten Schritt legen wir einen Beispiel Text an um die wichtigsten Suchfunktionen zu erklären: | ||
+ | |||
+ | |||
+ | Anlegen der Beispieldaten und indizieren: | ||
+ | <code sql> | ||
+ | -- as sys | ||
+ | -- grant rights to create the index | ||
+ | connect sys as sysdba | ||
+ | |||
+ | grant CTXAPP to gpi | ||
+ | |||
+ | connect gpi/gpi | ||
+ | |||
+ | create table texte ( id number(11) primary key, text varchar2(4000)); | ||
+ | insert into texte values (1,' | ||
+ | insert into texte values (2,' | ||
+ | insert into texte values (3,' | ||
+ | commit; | ||
+ | |||
+ | |||
+ | -- Index Properties for the lexer | ||
+ | -- exec ctx_ddl.drop_preference( ' | ||
+ | |||
+ | begin | ||
+ | ctx_ddl.create_preference( ' | ||
+ | ctx_ddl.set_attribute (' | ||
+ | -- nur 12c? | ||
+ | ctx_ddl.set_attribute (' | ||
+ | -- 10/11 | ||
+ | --ctx_ddl.set_attribute (' | ||
+ | end; | ||
+ | / | ||
+ | |||
+ | |||
+ | --Section group | ||
+ | -- exec CTX_DDL.DROP_SECTION_GROUP(' | ||
+ | |||
+ | begin | ||
+ | ctx_ddl.create_section_group (' | ||
+ | ctx_ddl.add_special_section (' | ||
+ | ctx_ddl.add_special_section (' | ||
+ | end; | ||
+ | / | ||
+ | |||
+ | |||
+ | -- create the index | ||
+ | -- drop index idx_texte ; | ||
+ | |||
+ | CREATE INDEX idx_texte ON texte(text) | ||
+ | | ||
+ | | ||
+ | / | ||
+ | |||
+ | ------------------ | ||
+ | -- check for errors | ||
+ | SELECT count(*) FROM ctx_user_index_errors | ||
+ | / | ||
+ | |||
+ | </ | ||
+ | |||
+ | Unsere Daten sehen dann so aus: | ||
+ | {{ : | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | ====Exakte Wort-/ | ||
+ | |||
+ | Suche nach dem Wort in allen Texten: | ||
+ | <code sql> | ||
+ | select id,text from texte where contains(text, | ||
+ | </ | ||
+ | |||
+ | Ergebnis: | ||
+ | * 1 Ein Hund steht neben der Hütte | ||
+ | * 2 Die liebsten Haustiere sind Katze und Hund | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | ====Logische Kombinationen “AND &”, “OR | ”, “NOT ==== | ||
+ | |||
+ | Über die logischen Operatoren können Kombinationen von Wörtern gesucht werden. | ||
+ | <code sql> | ||
+ | select * from texte where contains(text,' | ||
+ | select * from texte where contains(text,' | ||
+ | </ | ||
+ | |||
+ | Ergebnis: | ||
+ | * 2 Die liebsten Haustiere sind Katze und Hund | ||
+ | |||
+ | |||
+ | Die Suche nach dem Wort " | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | ====Wildcard-Suche==== | ||
+ | |||
+ | Mit _ nach einem beliebigen Zeichen, mit % nach beliebig vielen Zeichen suchen: | ||
+ | <code sql> | ||
+ | select * from texte where contains(text, | ||
+ | </ | ||
+ | |||
+ | Ergebnis: | ||
+ | * 1 Ein Hund steht neben der Hütte | ||
+ | |||
+ | Wird viel am Anfang oder am Ende eines einzelnen Wortes mit einem Wildcard gesucht, lohnt es sich den Index um die Eigenschaft " | ||
+ | |||
+ | ---- | ||
+ | |||
+ | ====Soundex - ! ==== | ||
+ | |||
+ | Nach einer ähnlichen Aussprache eines Wortes suchen, funktioniert am besten mit US Englisch in 7 Bit Darstellung, | ||
+ | |||
+ | <code sql> | ||
+ | select * from texte where contains(text, | ||
+ | </ | ||
+ | |||
+ | Ergebnis: | ||
+ | * 2 Die liebsten Haustiere sind Katze und Hund | ||
+ | |||
+ | Vermutlich wird hier auf den klassischen [[dba: | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | ====Fuzzy matching - ? ==== | ||
+ | |||
+ | Der Fuzzy matching Algorithmus ist deutlich mächtiger als der statische Soundex Algorithmus, | ||
+ | |||
+ | Es kann der **?** Operator oder für mehr Parameter **fuzzy(term, | ||
+ | |||
+ | <code sql> | ||
+ | -- Short Version | ||
+ | select * from texte where contains(text, | ||
+ | -- Details Version | ||
+ | select * from texte where contains(text, | ||
+ | </ | ||
+ | |||
+ | Ergebnis: | ||
+ | * 1 Ein Hund steht neben der Hütte | ||
+ | * 2 Die liebsten Haustiere sind Katze und Hund | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | ====Multilinguale Stammsuche - $ ==== | ||
+ | |||
+ | Mit der stem ($) Suche wird nach Wörtern mit der gleichen linguistischen Wurzel gesucht, in unsere Beispiel suchen wir nach " | ||
+ | |||
+ | Der Oracle Text Stemmer basiert auf der Lösung von XSoft Division of Xerox Corporation und unterstütze mit dem BASIC_LEXER: | ||
+ | |||
+ | Aufruf: | ||
+ | <code sql> | ||
+ | select * from texte where contains(text, | ||
+ | </ | ||
+ | |||
+ | Das erwartete Ergebnis: | ||
+ | * 1 Ein Hund steht neben der Hütte | ||
+ | |||
+ | |||
+ | Damit das funkioniert muss aber diese Eigenschaft vor dem anlegen des Indexes definiert werden: EXEC ctx_ddl.set_attribute (' | ||
+ | |||
+ | |||
+ | Das Dicitonary für zum Beispiel Deutsch liegt hier: $ORACLE_HOME/ | ||
+ | |||
+ | |||
+ | ---- | ||
+ | ====Near – Operator ==== | ||
+ | |||
+ | Mit Near wird ein Score bzgl. des Abstands von zwei Wörtern in einen Text ermittelt. | ||
+ | |||
+ | Suche in der Nähe der Begriffe mit einem Radius von 2: | ||
+ | <code sql> | ||
+ | select * from tab where contains(text, | ||
+ | </ | ||
+ | |||
+ | Ergebnis: | ||
+ | * 2 Die liebsten Haustiere sind Katze und Hund | ||
+ | |||
+ | |||
+ | |||
+ | ---- | ||
+ | ====Suche in Sektionen, Sätzen und Paragraphen - WITHIN==== | ||
+ | |||
+ | Suche in Abschnitten wie ein Satz: | ||
+ | <code sql> | ||
+ | select * from texte where contains(text,' | ||
+ | </ | ||
+ | |||
+ | Ergebnis: Alle 3 Zeilen | ||
+ | |||
+ | |||
+ | |||
+ | <fc # | ||
+ | |||
+ | Der Index muss natürlich auch entsprechend so aufgebaut werden, das Abschnitte erkannt werden können. | ||
+ | Stichwort Section Group, siehe die beim Indexaufbau verwendeten Einstellungen. | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | ====Themen bezogene (Themes) Suche - about ==== | ||
+ | <code sql> | ||
+ | select * from texte where contains(text, | ||
+ | </ | ||
+ | |||
+ | Ergebnis: | ||
+ | * 1 Ein Hund steht neben der Hütte | ||
+ | * 2 Die liebsten Haustiere sind Katze und Hund | ||
+ | |||
+ | Auch hier verläßt einen die XE Edition mit Deutsch, Fehler DRG-11422: linguistic initialization failed | ||
+ | DRG-11432: file error while accessing knowledge base, die passenden Dateien sind auf der Platte im Oracle Home nicht vorhanden. | ||
+ | |||
+ | Bzgl. theme Index siehe auch: [[dba: | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | ====Score bezogene Funktionen: accumulate, minus, weight==== | ||
+ | |||
+ | |||
+ | <code sql> | ||
+ | select * from texte where contains(text, | ||
+ | </ | ||
+ | |||
+ | Ergebnis: | ||
+ | * 1 Ein Hund steht neben der Hütte | ||
+ | |||
+ | <code sql> | ||
+ | select * from texte where contains(text, | ||
+ | </ | ||
+ | |||
+ | Ergebniss: Alle Zeilen in der Tabelle werden gefunden | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | ====Operationen auf Ergebnislisten: | ||
+ | |||
+ | <code sql> | ||
+ | select * from texte where contains(text, | ||
+ | </ | ||
+ | |||
+ | Ergebnis: | ||
+ | * 1 Ein Hund steht neben der Hütte | ||
+ | * 2 Die liebsten Haustiere sind Katze und Hund | ||
+ | |||
+ | ---- | ||
+ | |||
+ | ====ISO 2788 konformer Thesaurus - SYN, NT, BT ==== | ||
+ | |||
+ | <code sql> | ||
+ | select * from texte where contains(text, | ||
+ | </ | ||
+ | |||
+ | Der Thesaurus muss zuvor definiert werden, ansonsten wird die Fehlermeldung " | ||
+ | |||
+ | Ein Thesaurus | ||
+ | <code sql> | ||
+ | select CTX_THES.SYN(' | ||
+ | </ | ||
+ | siehe dazu [[dba: | ||
+ | |||
+ | ---- | ||
+ | |||
+ | ==== Quellen ==== | ||
+ | |||
+ | Doku: | ||
+ | * https:// | ||
+ | |||
prog/oracle_text_contains.txt · Zuletzt geändert: 2023/11/08 14:11 von gpipperr