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

考えられる理由は 2 つあります。インデックスが同期されていない可能性があり、文字列CONTAINSと一致しているのに単語と一致しているように見えLIKEます。

LIKE両方に一致するが、どちらにも一致しない2 つの文字列の例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

これにより、問題の 1 つが修正されます。しかしQ234567、まだ一致していません。私は Oracle Text についてよく知りません。また、どのようにCONTAINS機能するかについての簡単な説明さえ見つけることができません。ただし、文字列ではなく完全な単語に基づいているようです。CONTAINSQ2 と他の文字の間には、単純なフィルターで検出される単語境界のようなものが必要です。

于 2013-03-14T06:30:55.577 に答える