2015-12-01 5 views
7

Ich habe einen Web-Service in Java, der Suchen auf einer Oracle 12c Datenbank durchführt. Das Problem ist, ich habe eine CONTAINS() Suche:Oracle Database 12c: Wie bekomme ich auch den Ergebnisindex von einer Suche enthält

String query = "select * from sys.my_table WHERE CONTAINS(my_clob_field, '" + searchString + "', 1) > 0"; 

aber ich mag auch den Index (n) des Suchwortes oder eine Phrase innerhalb der Ergebnisse erhalten.

Derzeit habe ich versucht, jedes der zurückgegebenen Suchergebnisse und durchlaufen sie durch eine Suche REGEX in Java, um die Start- und Stoppindizes zu finden, die benötigt werden, um das Suchergebnis am Frontend zu markieren.

Dies funktioniert für normalen Text in Ordnung, aber wenn die Voraussetzung ist, dass der Benutzer für jede zufällige Anordnung von beliebigen Zeichen suchen kann (dh < # @ (F #> <) $ *> /\./# &!) #} {}] [s fdf) Die Java-Suche muss auch diese exakte Zeichenfolge finden und den Start- und Stoppindex zurückgeben.

Ich entziffere alle Sonderzeichen für die Oracle-Suche, aber für die Java-Suche wird ein ganz anderer Satz von Regeln benötigt, um den Index zu finden. Der Versuch, sie in Übereinstimmung zu bringen, hat sich als Albtraum herausgestellt, und in der Regel findet die Java-Suche nicht die gleichen Vorkommnisse wie die Oracle-Datenbanksuche. Ich glaube, dass der Ansatz, den ich mache, völlig falsch ist, und es sollte einen einfachen Weg geben, um auch die Indizes des Auftretens des Suchworts (oder -satzes) zu erhalten.

TL; DR: Wenn eine CONTAINS() Suche durchgeführt wird, wie könnte ich auch die Indizes der Suche Wort oder eine Phrase in den zurückgegebenen Suchergebnisse nur eine Oracle-Datenbank-Abfrage mit finden (so habe ich nicht zu sich Sorgen machen, dass die Suchergebnisse nicht mit einem REGEX-Mismatch übereinstimmen)?

+3

'sys.my_table' ??? Erstellen Sie keine eigenen Tabellen im 'SYS' Tablespace. Tu es einfach nicht. Und verwenden Sie 'SYS' oder' SYSTEM' nicht für regelmäßige Arbeit. Erstellen Sie einen normalen Benutzer und legen Sie Ihre Anwendungsdaten in den 'USERS'-Tablespace (oder erstellen Sie einen neuen). Verwenden Sie ** ** nicht ** das Systemkonto oder die Tablespaces für Ihre Anwendungsdaten. –

Antwort

0

Vielleicht suchen Sie etwas wie REGEXP_INSTR()? Wenn keine Übereinstimmung gefunden wird, wird Null zurückgegeben, andernfalls wird die Position des ersten Zeichens (oder des folgenden ersten Zeichens) der übereinstimmenden Teilzeichenfolge zurückgegeben.

select 
    mytab.*, 
    regexp_substr(my_clob_field, searchString), 
    regexp_instr(my_clob_field, searchString) 
from sys.my_table mytab 
WHERE CONTAINS(my_clob_field, '" + searchString + "', 1) > 0 
+0

Das sieht vielversprechend aus. Was passiert, wenn die Suchzeichenfolge mehrfach im CLOB-Feld vorkommt? Von der Abfrage brauche ich den Text aus dem CLOB-Feld (den ich bereits bekommen habe) und auch die Indizes jedes Suchstring-Auftretens. Können Sie ein Implementierungsbeispiel bereitstellen? Müssten zwei Abfragen ausgeführt werden, eine Abfrage für den CLOB-Feldtext (mit CONTAINS()) und eine weitere Abfrage der Indizes? – John

+0

Wenn die Suchzeichenfolge möglicherweise mehrere Übereinstimmungen enthält, ist es wahrscheinlich besser, eine PL/SQL-Prozedur zu schreiben, um diese wiederholte Suche durchzuführen. Um die erste Übereinstimmung und ihren Index zurückzugeben, können Sie dies in einer Abfrage tun. Ich werde ein Beispiel in meiner Antwort oben veröffentlichen. –

+0

Ich bekomme "von Schlüsselwort nicht gefunden, wo erwartet" -Fehler, wenn Sie diese Java-Implementierung Ihrer Abfrage verwenden: 'String query =" auswählen *, regexp_substr (my_clob_field, '"+ searchString +' '), regexp_instr (mein_klonfeld,' "+ searchString + '') aus sys.my_table WO CONTAINS (my_clob_field, '" + searchString +' ', 1)> 0 ";' – John

Verwandte Themen