2013-03-13 2 views
5

コンテキスト索引付けされた表に列があります。Oracle Containsが機能していません

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

と私は条件

とは

LIKE 'Q2の%' をmust_fix_byどこでクエリをしようとしていますし、それが行を返します。

は、しかし、私は条件

とは(must_fix_by、 'Q2')> 0

が含まれている場所でクエリをしようとすると、それがどの行を返しません。

誰かが私のように働いていて、含まれていない理由を教えてもらえますか?

+0

2番目のクエリで何を達成しようとしていますか?その文字列を含むレコードの数を調べるには、count(contains(must_fix_by、 'Q2'))> 0が必要ですか? – thursdaysgeek

+0

Q2を持つすべての行をmust_fix_byで戻す問合せが必要です。私はLIKEと一緒に行くことができると知っていますが、なぜ含まれているのか分かりません。 – Jeevan

+0

ああ、申し訳ありませんが、私は間違った質問を読んだ。 – thursdaysgeek

答えて

5

インデックスが同期されていない可能性があります。CONTAINSは単語と一致するようですが、LIKEは文字列と一致します。

LIKEマッチの両方が、CONTAINS試合でもない2つの文字列の例:デフォルトでは

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 

これは、問題の1つを修正します。しかし、Q234567はまだ一致しません。私はOracle Textについて多くのことを知らないし、CONTAINSがどのように機能するかについての簡単な説明も見つけられません。しかし、それは文字列の代わりに完全な単語に基づいているようです。単純なCONTAINSフィルタでは、Q2と他の文字との間に何らかの単語境界 が含まれている必要があります。

+0

ありがとうございましたjonearles – Jeevan

関連する問題