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.