Deux raisons possibles :l'index n'est peut-être pas synchronisé et CONTAINS
semble correspondre aux mots alors que LIKE
correspond aux chaînes.
Un exemple de deux chaînes, où LIKE
correspond aux deux, mais CONTAINS
ne correspond à aucun :
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
Par défaut, CONTEXT
les index doivent être synchronisés manuellement
. Vous devez soit exécuter :exec ctx_ddl.sync_index('cidx_mustfixby');
, ou vous devez créer votre index avec on commit
.
exec ctx_ddl.sync_index('cidx_mustfixby');
select * from test1 where contains(must_fix_by, 'Q2') > 0;
MUST_FIX_BY
-----------
Q2 234567
Cela résout l'un des problèmes. Mais Q234567
n'est toujours pas égalé. Je ne connais pas grand-chose à Oracle Text et je ne trouve même pas de description simple de la façon dont CONTAINS
œuvres. Mais il semble être basé sur des mots complets au lieu de chaînes. Il doit y avoir une sorte de limite de mot entre Q2 et les autres caractères pour qu'il soit capté par un simple CONTAINS
filtre.