Select Abfrage

Hallo,

ich verusche jetzt schon länger das folgende Problem zu
lösen. Zuerst sei gesagt, ich bin oracle/sql Anfänger. Ich habe zur Datenbank und sql
Bearbeitung den „Quest-Toad“ zur Verfügung. Schonmal Danke im voraus.

Also ich bin im Moment bei folgender Abfrage:

select vision2003.telocation.LOCATION, vision2003.telocation.IDENTIFIER, vision2003.dr$i_telocation_location$i.TOKEN_TEXT

from vision2003.telocation , vision2003.dr$i_telocation_location$i

where (vision2003.telocation.location = vision2003.dr$i_telocation_location$i.token_text(+))
and contains (location, ‚Diabetes and Mellitus‘)>0;

Nur leider werden mir in der TOKEN_TEXT Spalte keine Werte wiedergegeben. Die beiden Tabellen sind, soweit ich das gesehen habe, nur über den Index „Table Owner“ verknüpft, der bei beiden Vision2003_Dev ist.
Wenn wenigstens in beiden Tabellen eine gleiche Spalte vorkommen würde, könnte man diese ja einfach verbinden…
Die Spalten location und token_text haben nicht gleiche Inhalte. In Token_text stehen Worte wie „Nord“ und wenn man dies in einem contains in dem location suchen lässt, findet er das Nord auf der zu dem identifier gehörenden Seite.

Was ich jetzt möchte ist das Token_Text und den Identifier und location auf einer Seite ausgeben, so dass man klar sehen kann welches Wort zu welcher Seite gehört.
Doch bei der where Bedingung wo die beiden Tabellen verglichen werden, fehlt noch der entscheidene Schritt, damit er dem IDENTIFEIR/LOCATION den TOKEN_TEXT zuweisen kann.

Es wurde oracle intermediatext benutzt um die Tabelle zu füllen. Ich habe den index aber nicht programmiert, sondern darf ihn jetzt nur auswerten.

Die Indizes wurden nach dem Schema angelegt
create index i_telocation_location on telocation(location) indextype is
ctxsys.context parameters(!datastore URL_PREF’);

die Spalten der Tabelle dr$i_telocation_location$i sind Token_text(varchar2), token_type(Number), token_frist(Number), token_last (Number). token_count(Number) und token_info(BLOB)

die Spalten der Tabelle telocation sind Identifier(Number), ID(Number), Location (Varchar2) und Changedate(Date)

doch es gibt keine direkte Verbindung zwischen den Tabellen. Halt nur irgendwie über den index.

Inhalt Token_Text:

Autos
Autor
Autoren
Lists
Look
Scanning

usw. ca. 300000 Einträge

Inhalt Identifier:

97042081
1572379089
1146793510

usw.

Inhalt Location:

http://www.hirn.uni-duesseldorf.de/~rk/Teaching/bg.htm
http://www.medicine-worldwide.de/kra…gen/index.html
http://www.neuroscript.com

usw.

Hallo,

ich glaube, da hast du etwas konzeptionell missverstanden. Wenn du mit Oracle
Text eine Column indiziert, legt Oracle eben diese DR$XXX Tabellen an, welche,
je nach Attribut und Lexer - Einstellungen die indizierten Daten beinhalten.
Diese Tabellen sind aber nicht dazu da, direkt abgefragt zu werden, sondern die
CONTAINS - muss auf das indexierte Feld in der Ursprungstabelle verweisen.

Beispiel mit einem XML Dokument (Habe gerade kein URL Beispiel zur Hand)

CREATE INDEX XML_DOCUMENT_PATH_IDX ON APP_XML_DOCUMENT(DOCUMENT_XML) INDEXTYPE IS ctxsys.context PARAMETERS
(‚Wordlist UnisysWordList LEXER UnisysLexer datastore ctxsys.default_datastore filter ctxsys.null_filter section group
xmlpathgroup‘);

  • Die Attribute UnisysWordList und UnisysLexer sind optional…
  • Und eine Abfrage würde so aussehen:

select * from APP_XML_DOCUMENT
where (contains(DOCUMENT_XML,’%auto% INPATH (/Report)’)>0)

Im Oracle Text Application Developer’s Guide ist dass im übrigen sehr gut beschrieben.

Hallo,

Nur leider werden mir in der TOKEN_TEXT Spalte keine Werte
wiedergegeben. Die beiden Tabellen sind, soweit ich das
gesehen habe, nur über den Index „Table Owner“ verknüpft, der
bei beiden Vision2003_Dev ist.

Es wurde oracle intermediatext benutzt um die Tabelle zu
füllen. Ich habe den index aber nicht programmiert, sondern
darf ihn jetzt nur auswerten.

Die Indizes wurden nach dem Schema angelegt
create index i_telocation_location on telocation(location)
indextype is
ctxsys.context parameters(!datastore URL_PREF’);
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Also ich kann mit dieser Abfrage die einzelnen Seiten anziegen lassen die das Wort Diabetes enthalten.

select identifier,location from vision2003.telocation where contains (location, 'Diabetes ')>0;

Mit dieser Abfrage kann ich alle Seiten anzeigen lassen, wo token_text diesen Begriff gespeichert hat.

select location, identifier from vision2003.telocation, vision2003.dr$i_telocation_location$i where token_text= ‚BRONCHOGENIC‘;

wenn ich jetzt aber die Spalte Token_text hinter die select Anweisung setze wirft er mir nur Müll aus, wo in jeder Zeile das selbe steht, woran mag as liegen?

Das liegt daran, dass du keinerlei Join Bedingung angegeben hast. Als Ergebniss bekommst du dann jeden Eintrag aus der ersten Tabelle in Kombination mit jeweils jedem Eintrag aus der zweiten Tabelle.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Versuch es doch mal mit der folgenden Where Klausel:
where contains(vision2003.telocation.location, vision2003.dr$i_telocation_location$i.token_text)>0)
and contains (location, ‚Diabetes and Mellitus‘)>0

Ich kenne mich mit intermedia nicht aus, von daher ist das nur gezielt geraten … aber manchmal trifft man so ja auch :smile: