两个可能的原因 - 索引可能不同步,并且在匹配字符串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
过滤器拾取。