インデックスが同期されていない可能性があります。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と他の文字との間に何らかの単語境界 が含まれている必要があります。
2番目のクエリで何を達成しようとしていますか?その文字列を含むレコードの数を調べるには、count(contains(must_fix_by、 'Q2'))> 0が必要ですか? – thursdaysgeek
Q2を持つすべての行をmust_fix_byで戻す問合せが必要です。私はLIKEと一緒に行くことができると知っていますが、なぜ含まれているのか分かりません。 – Jeevan
ああ、申し訳ありませんが、私は間違った質問を読んだ。 – thursdaysgeek