2015-12-01 18 views
7

Ho un servizio Web in Java che esegue ricerche su un database Oracle 12c. Il problema è che ho una ricerca CONTAINS():Database Oracle 12c: Come ottenere l'indice dei risultati da una ricerca contiene

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

ma voglio anche per ottenere l'indice (es) della parola o frase all'interno dei risultati.

Attualmente quello che ho provato è quello di prendere ciascuno dei risultati di ricerca restituiti e passare attraverso di loro l'esecuzione di un REGEX ricerca in Java per trovare l'inizio e fermare gli indici necessari per evidenziare il risultato della ricerca sul front-end.

Questo funziona bene per il testo normale, ma se il requisito è che l'utente può cercare qualsiasi disposizione casuale di caratteri (cioè # < @ (F #> <) $ *> /\./# &!) #} {}] [s fdf) la ricerca Java deve anche trovare quella stringa esatta e restituire l'indice start e stop.

Non riesco a scovare alcun carattere speciale per la ricerca Oracle, ma per la ricerca Java è necessario un insieme di regole completamente diverso per trovare l'indice. Cercare di convincerli a combaciare è risultato essere un incubo e in genere la ricerca Java REGEX non trova le stesse occorrenze rilevate dalla ricerca del database Oracle. Credo che l'approccio che sto prendendo sia completamente sbagliato e ci dovrebbe essere un modo semplice per ottenere anche gli indici delle occorrenze della parola di ricerca (o frase).

TL; DR: Quando si esegue una ricerca CONTAINS(), come potrei anche trovare gli indici della parola o frase all'interno dei risultati di ricerca restituiti utilizzando solo una query di database Oracle (quindi non c'è bisogno di preoccuparsi di perdere i risultati della ricerca in una mancata corrispondenza REGEX)?

+3

'sys.my_table' ??? Do *** not *** crea le tue tabelle nello spazio tabelle 'SYS'. Non farlo. E non usare 'SYS' o' SYSTEM' per il lavoro regolare. Crea un utente normale e metti i dati dell'applicazione nel tablespace 'USERS' (o creane uno nuovo). Ma fai ** non ** usa l'account di sistema o i tablespace per i dati della tua applicazione. –

risposta

0

Forse stai cercando qualcosa come REGEXP_INSTR()? Restituirà zero se non corrisponde, altrimenti restituisce la posizione del primo carattere di (o del primo carattere che segue) la sottostringa corrispondente.

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

Sembra promettente. Cosa succede se ci sono più occorrenze della stringa di ricerca nel campo CLOB? Dalla query, ho bisogno del testo dal campo CLOB (che stavo già ricevendo) e anche degli indici di ogni occorrenza della stringa di ricerca. Potete fornire un esempio di implementazione? Dovrebbero esserci due query, una per ottenere il testo del campo CLOB (usando CONTAINS()), e un altro per ottenere gli indici? – John

+0

Se ci sono potenzialmente diverse corrispondenze nella stringa di ricerca, probabilmente è meglio scrivere una procedura PL/SQL per eseguire questa corrispondenza ripetuta. Per quanto riguarda la restituzione della prima corrispondenza e del suo indice, puoi farlo in una sola query, pubblicherò un esempio nella mia risposta sopra. –

+0

Viene visualizzato l'errore "dalla parola chiave non trovata dove previsto" quando si utilizza l'implementazione Java della query: 'String query =" select *, regexp_substr (my_clob_field, '"+ searchString +"'), regexp_instr (my_clob_field, ' "+ searchString +" ') da sys.my_table WHERE CONTAINS (my_clob_field,' "+ searchString +" ', 1)> 0 ";' – John

Problemi correlati