2013-03-13 116 views
5

我在我的表中有一个上下文索引的列。Oracle包含不起作用

CREATE INDEX CIDX_MUSTFIXBY ON TABLE 
    (MUST_FIX_BY) 
INDEXTYPE IS CTXSYS.CONTEXT 
NOPARALLEL; 

,我试图用WHERE条件

和must_fix_by LIKE '%Q2'

查询并返回行。

然而,当我尝试查询与WHERE条件

,并包含(must_fix_by, 'Q2')> 0

,它不返回任何行。

有人可以告诉我,为什么像工作和包含不是?

+0

你想用第二个查询来完成什么?你想要一个计数(包含(must_fix_by,'Q2'))> 0为了找出有多少记录包含该字符串? – thursdaysgeek 2013-03-13 20:50:32

+0

我希望查询返回must_fix_by中具有Q2的所有行。我知道我可以去LIKE,但我想知道为什么包含不起作用。 – Jeevan 2013-03-13 21:58:18

+0

哦,对不起,我看错了这个问题。 – thursdaysgeek 2013-03-13 22:06:48

回答

5

两个可能的原因 - 索引可能不同步,并且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过滤器进行拾取。

+0

谢谢你jonearles – Jeevan 2013-03-14 13:18:21