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.