[Oracle] Oracle Text Suche über mehrere Spalten

-=Renegade=-

Lt. Junior Grade
Registriert
Nov. 2006
Beiträge
427
Hallo,


Ich möchte eine Art Volltextsuche in Oracle implementieren, wobei das gesuchte Wort nicht nur in einer Spalte, sondern in mehreren und im Idealfall auch in Spalten auf anderen Tabellen vorkommen kann.

Ich hab mir dazu die Oracle Text Funktion bereits angesehen, die ansich recht gut aussieht, nur mit dem Problem, das sie eigentlich für einen Spalte ausgelegt ist. Man kann dann zwar Index Sets erstellen, aber lt. Oracle 10g - The complete reference S. 475 muss man hier wieder im Searchquery jede Spalte einzeln auswählen und mit einem Suchwort belegen. Ich möchte dies aber vermeiden und das Query nicht mühsam per Hand zusammen bauen, sondern ein mal indizieren und danach soll nach dem selben Wort automatisch in allen indizierten Spalten gesucht werden. Ich hab auch schon Oracle Text Application Developers Guide und Oracle Text Reference überflogen, aber nichts passendes gefunden (vllt. hab ichs auch einfach übersehen)

Gibt es dafür eine adequate (Oracle Text?) Lösung?

Vielen Dank im Voraus,


so long
Renegade
 
Dafür könnten sich VIEWs eignen.

mfg
 
@Renegade: Eigentlich hast Du die gängige Lösung ja schon genannt. Die Text-Funktion durchsucht Text-Felder auf Vorhandensein von Strings. Du musst natürlich nicht den Suchquery manuell zusammenbauen, sondern kannst das eine gespeicherte Prozedur erledigen lassen. Der Prozedur kannst Du nach Belieben Inputparameter (wie z.B. die Suchwörter und/oder die Feldnamen) mitgeben. Ein View ist in diesem Fall übrigens vermutlich nicht zielbringend - die einzige (mir momentan einfallende) Variante, einen View hier sinnvoll einzusetzen, scheint mir nachteilig auf die Performance im Vergleich zur SP.
 
Zuletzt bearbeitet:
Views sind mir in dem Kontext auch nicht wirklich sinnvoll erschienen.

@Prozedur: Auch damit bin ich nicht wirklich glücklich... Sicher kann ich mir hier die Abfrage zusammenbauen, aber das Problem bleibt das gleiche, ob jetzt in PHP oder PL/SQL, ich muss das Query einmal per Hand zusammenbauen.

Hab inzwischen eine Lösung gefunden, mit der ich mehrere Spalten einer Tabelle absuchen kann, jetzt suche ich noch eine Möglichkeit, mehrere Spalten derselben Tabelle zu verknüpfen.


Anbei noch die bisherige Lösung, sollte jemand mal danach suchen:
Der Benutzer, der die Suche ausführen will, benötigt Rechte auf die Rolle CTXAPP sowie Ausführungsrechte auf das Package CTXSYS.CTX_DLL
Code:
GRANT "CTXAPP" TO <USER> WITH ADMIN OPTION;
ALTER USER <USER> DEFAULT ROLE NONE;
GRANT EXECUTE ON CTXSYS.CTX_DDL TO <USER>

Danach wird über das ctx_dll Package ein Multi Column Datastore erstellt und ein Index angelegt:
Code:
BEGIN
ctx_ddl.drop_preference('fullsearch');
ctx_ddl.create_preference('fullsearch', 'MULTI_COLUMN_DATASTORE');
ctx_ddl.set_attribute('fullsearch', 'columns', '<Column1>, <Column2>, <Column3>');
END;

DROP INDEX i_fullsearch;
CREATE INDEX i_fullsearch ON <Table>(<Column1>) 
  INDEXTYPE IS ctxsys.context 
  PARAMETERS ('DATASTORE fullsearch');

Danach kann in Einträgen aller Spalten gesucht werden, in dem der Index der Spalte aufgerufen wird, auf die er erstellt wurde
Code:
SELECT * FROM <Table> WHERE CONTAINS (<Column1>, 'M1C4') > 0

Da der Index auch die Daten der anderen Spalten enthält, liefert er trotzdem Resultate, die nicht in der eigentlichen Spalte <Column1> stehen.


Der Code funktioniert jedoch wie gesagt nur für Spalten innerhalb einer Tabelle, nicht für Spalten verschiedener Tabellen. Und auf eine View kann leider kein Index gelegt werden. Vllt hat ja jemand eine Idee.


so long
Renegade
 
die procedure kann sich aber selber das qry, sprich die spalten, zusammen bauen,
wenn es die ziel tablle kennt.
 
Zuletzt bearbeitet:
Ja, aber da ich den Suchaufruf nur ein einziges Mal benötige, bleibt es sich gleich ob ich die Funktion im PL/SQL generieren lasse oder im PHP Source selber, die Lösung bleibt unsauberer, im Vergleich zur jetzigen, mMn. Vor allem benötige ich so nur mehr einen einzigen Index.
 
Zurück
Oben