Две възможни причини - индексът може да не е синхронизиран и CONTAINS
изглежда съвпада с думи, докато LIKE
съвпада с низове.
Пример за два низа, където LIKE
съвпада и с двете, но CONTAINS
не съвпада с нито едно:
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
По подразбиране, CONTEXT
индексите трябва да бъдат ръчно синхронизирани
. Трябва или да изпълните:exec ctx_ddl.sync_index('cidx_mustfixby');
, или трябва да създадете своя индекс с on commit
.
exec ctx_ddl.sync_index('cidx_mustfixby');
select * from test1 where contains(must_fix_by, 'Q2') > 0;
MUST_FIX_BY
-----------
Q2 234567
Това коригира един от проблемите. Но Q234567
все още не съответства. Не знам много за Oracle Text и дори не мога да намеря просто описание как CONTAINS
върши работа. Но изглежда, че се основава на пълни думи вместо на низове. Трябва да има някаква граница на думата между Q2 и други знаци, за да може тя да бъде взета от прост CONTAINS
филтър.