Dwie możliwe przyczyny - indeks może nie być zsynchronizowany i CONTAINS
wydaje się pasować do słów, gdy LIKE
dopasowuje ciągi.
Przykład dwóch ciągów, gdzie LIKE
pasuje do obu, ale CONTAINS
nie pasuje do żadnego:
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
Domyślnie CONTEXT
indeksy muszą być ręcznie synchronizowane
. Musisz albo uruchomić:exec ctx_ddl.sync_index('cidx_mustfixby');
, lub musisz utworzyć indeks za 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 rozwiązuje jeden z problemów. Ale Q234567
nadal nie jest dopasowany. Nie wiem zbyt wiele o Oracle Text i nie mogę nawet znaleźć prostego opisu tego, jak CONTAINS
Pracuje. Ale wydaje się, że opiera się na pełnych słowach, a nie na ciągach. Musi istnieć jakaś granica słów między Q2 a innymi znakami, aby mogła zostać pobrana przez proste CONTAINS
filtr.