6

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

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

我正在尝试查询 where 条件

AND must_fix_by LIKE 'Q2%'

它返回行。

但是,当我尝试使用 where 条件进行查询时

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

并且它不返回任何行。

有人可以告诉我为什么 like 有效而 contains 无效吗?

4

2 回答 2

6

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

于 2013-03-14T06:30:55.577 回答
0

使用 CONTAINS 时还需要添加 %。

AND contains(must_fix_by, 'Q2%') > 0
于 2018-09-11T18:28:05.883 回答