Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle Contains non funziona

Due possibili ragioni:l'indice potrebbe non essere sincronizzato e CONTAINS sembra corrispondere alle parole mentre LIKE corrisponde alle stringhe.

Un esempio di due stringhe, dove LIKE corrisponde a entrambi, ma CONTAINS non corrisponde a nessuno dei due:

create table test1(must_fix_by varchar2(4000));
create index cidx_mustfixby on test1(must_fix_by) indextype is ctxsys.context;
insert into test1 values('Q234567');
insert into test1 values('Q2 234567');
select * from test1 where must_fix_by like 'Q2%';

MUST_FIX_BY
-----------
Q234567
Q2 234567

select * from test1 where contains(must_fix_by, 'Q2') > 0;

no rows selected

Per impostazione predefinita, CONTEXT gli indici devono essere sincronizzazione manuale . Devi eseguire:exec ctx_ddl.sync_index('cidx_mustfixby'); o devi creare il tuo indice con on commit .

exec ctx_ddl.sync_index('cidx_mustfixby');
select * from test1 where contains(must_fix_by, 'Q2') > 0;

MUST_FIX_BY
-----------
Q2 234567

Questo risolve uno dei problemi. Ma Q234567 non è ancora abbinato. Non so molto di Oracle Text e non riesco nemmeno a trovare una semplice descrizione di come CONTAINS lavori. Ma sembra essere basato su parole complete anziché su stringhe. Ci deve essere una sorta di confine di parole tra Q2 e altri caratteri per poter essere raccolto da un semplice CONTAINS filtro.