Dva možné důvody – index nemusí být synchronizován a CONTAINS
Zdá se, že odpovídá slovům, zatímco LIKE
odpovídá řetězcům.
Příklad dvou řetězců, kde LIKE
odpovídá oběma, ale CONTAINS
neodpovídá ani jednomu:
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
Ve výchozím nastavení CONTEXT
indexy je třeba ručně synchronizovat
. Buď musíte spustit:exec ctx_ddl.sync_index('cidx_mustfixby');
, nebo si musíte vytvořit index pomocí on commit
.
exec ctx_ddl.sync_index('cidx_mustfixby');
select * from test1 where contains(must_fix_by, 'Q2') > 0;
MUST_FIX_BY
-----------
Q2 234567
To řeší jeden z problémů. Ale Q234567
se stále neshoduje. O Oracle Text toho moc nevím a nemohu ani najít jednoduchý popis toho, jak CONTAINS
funguje. Zdá se však, že je založen na plných slovech namísto řetězců. Mezi Q2 a dalšími znaky musí být nějaká hranice slova, aby to bylo možné zachytit jednoduchým CONTAINS
filtr.