两个可能的原因 - 索引可能不同步,并且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
指标必须manually synchronized。您需要运行: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
过滤器进行拾取。
你想用第二个查询来完成什么?你想要一个计数(包含(must_fix_by,'Q2'))> 0为了找出有多少记录包含该字符串? – thursdaysgeek 2013-03-13 20:50:32
我希望查询返回must_fix_by中具有Q2的所有行。我知道我可以去LIKE,但我想知道为什么包含不起作用。 – Jeevan 2013-03-13 21:58:18
哦,对不起,我看错了这个问题。 – thursdaysgeek 2013-03-13 22:06:48