Oracle Contains不起作用

Jap*_*ans 5 sql oracle

我的表中有一个列是上下文索引的列.

CREATE INDEX CIDX_MUSTFIXBY ON TABLE
  (MUST_FIX_BY)
INDEXTYPE IS CTXSYS.CONTEXT
NOPARALLEL;
Run Code Online (Sandbox Code Playgroud)

我正在尝试查询条件

AND must_fix_by LIKE'Q2%'

它返回行.

但是,当我尝试查询条件时

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

并且它不会返回任何行.

有人可以告诉我为什么喜欢工作而且包含不是吗?

Jon*_*ler 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
Run Code Online (Sandbox Code Playgroud)

默认情况下,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
Run Code Online (Sandbox Code Playgroud)

这解决了其中一个问题.但Q234567仍然不匹配.我对Oracle Text知之甚少,甚至找不到如何CONTAINS工作的简单描述.但它似乎是基于完整的单词而不是字符串.Q2和其他字符之间需要某种字边界,以便通过简单的CONTAINS过滤器来拾取它.