2015-12-01 12 views
7

Mam usługę internetową w Javie, która wykonuje wyszukiwania w bazie danych Oracle 12c. Problemem jest to, mam CONTAINS() wyszukiwania:Baza danych Oracle 12c: Jak również uzyskać indeks wyników z wyszukiwania zawierającego

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

ale chcę też, aby uzyskać indeks (-y) szukanego słowa lub frazy w wynikach.

Obecnie staram się pobrać wszystkie zwrócone wyniki wyszukiwania i wykonać je, wykonując wyszukiwanie w języku Java, aby znaleźć indeksy początkowe i końcowe potrzebne do wyróżnienia wyniku wyszukiwania na interfejsie użytkownika.

Działa to dobrze dla zwykłego tekstu, ale jeśli wymogiem jest, że użytkownik może szukać dowolny losowy układ jakichkolwiek znaków (tj # < @ (F #> <) $ *> /\./# &!) #} {}] [s fdf) wyszukiwanie w Javie musi również znaleźć dokładny ciąg znaków i zwrócić indeks początkowy i końcowy.

Unikałem znaków specjalnych do wyszukiwania Oracle, ale zupełnie inny zestaw reguł jest potrzebny do wyszukiwania w Javie, aby znaleźć indeks. Próba zmuszenia ich do dopasowania okazała się koszmarem i zazwyczaj wyszukiwanie nie wykrywa takich samych zdarzeń, jakie znajduje wyszukiwanie w bazie danych Oracle. Uważam, że podejście, które stosuję, jest całkowicie błędne i powinien istnieć prosty sposób na uzyskanie indeksów występowania słowa (lub frazy) wyszukiwania hte.

TL; DR: Podczas wykonywania CONTAINS() wyszukiwania, jak mogłem również znaleźć indeksy wyszukiwania słowa lub frazy w zwróconych wyników wyszukiwania z wykorzystaniem jedynie zapytanie Oracle Database (więc nie trzeba martwić się o utratę wyników wyszukiwania do niedopasowania REGEX)?

+3

'sys.my_table' ??? Czy *** nie *** twórz własne tabele w obszarze tabel "SYS". Po prostu nie rób tego. I nie używaj "SYS" lub "SYSTEM" do regularnej pracy. Utwórz zwykłego użytkownika i umieść dane aplikacji w obszarze tabel "USERS" (lub utwórz nowy). Ale ** nie ** używaj konta systemowego lub obszarów tabel do danych aplikacji. –

Odpowiedz

0

Być może szukasz czegoś takiego jak REGEXP_INSTR()? Zwróci zero, jeśli nie pasuje, w przeciwnym razie zwraca położenie pierwszego znaku (lub pierwszego znaku następującego po nim) pasującego podciągu.

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

To wygląda obiecująco. Co się dzieje, jeśli w polu CLOB występuje wiele wystąpień ciągu wyszukiwania? Z kwerendy potrzebuję tekst z pola CLOB (które już otrzymałem), a także indeksy każdego wystąpienia ciągu wyszukiwania. Czy możesz podać przykład wdrożenia? Czy byłyby potrzebne dwa zapytania: jeden do uzyskania tekstu pola CLOB (za pomocą CONTAINS()), a drugi do uzyskania indeksów? – John

+0

Jeśli istnieje potencjalnie kilka dopasowań w ciągu wyszukiwania, prawdopodobnie lepiej jest napisać procedurę PL/SQL, aby wykonać to powtarzające się dopasowywanie. Jeśli chodzi o zwrócenie pierwszego dopasowania i jego indeksu, możesz to zrobić w jednym zapytaniu, post zamieszczę w powyższej odpowiedzi. –

+0

Otrzymuję komunikat "od słowa kluczowego nie znaleziono, gdzie oczekiwano" podczas korzystania z tej implementacji Java zapytania: 'String query =" select *, regexp_substr (my_clob_field, '"+ searchString +"'), regexp_instr (my_clob_field, ' "+ searchString +" ') z sys.my_table WHERE CONTAINS (my_clob_field,' "+ searchString +" ', 1)> 0 ";' – John