5

OracleDatabase10gおよびOracleDatabaseExpress Edition 11gで、奇妙な動作が発生しました。ctxsys.contextタイプのインデックスとしてインデックス付けされた列があります。contains関数を使用して結果をテーブルにクエリすると、検索している値が「Still」の場合を除いて機能します。その後、結果は返されません。「Still」のような列で同じデータを検索すると、通常どおり結果が得られます。containsを使用して「Jazz」を検索すると、通常どおり結果が得られます。

以下は、新しく作成されたテストテーブルでこの動作を再現するために使用したSQLです。

-- Setup the table with an index and some data
create table "STILL_TEST" (
    "ID" number(22,0) primary key,
    "PROF_DATA_15" varchar2(255 char),
    "OTHER" varchar2(255 char),
    "SHORTER" varchar2(100 char)
);
insert into "STILL_TEST" values (1, 'Still', 'Still', 'Still');
insert into "STILL_TEST" values (3, 'Jazz', 'Jazz', 'Jazz');
CREATE INDEX "STILL_TEST_PROF_DATA_15" ON "STILL_TEST" ("PROF_DATA_15")
   INDEXTYPE IS "CTXSYS"."CONTEXT" PARAMETERS ('SYNC (ON COMMIT)');
commit;

-- Now query it a bit. See how both types of queries work if the
-- parameter is 'Jazz'
select * from "STILL_TEST" where prof_data_15 like 'Jazz';
select * from "STILL_TEST" where contains(prof_data_15, 'Jazz') > 0;
select * from "STILL_TEST" where prof_data_15 like 'Still';
-- So far so good, but why doesn't this next query return any results?
select * from "STILL_TEST" where contains(prof_data_15, 'Still') > 0;
4

1 に答える 1

4

ここでは、デフォルトの停止リストに問題があるようです。空のストップ リストを使用してインデックスを作成すると、「まだ」などのキーワードが検索パラメーターとして扱われます。

以下は、空のストップ リストでインデックスを作成します。

 CREATE INDEX "STILL_TEST_PROF_DATA_15" ON "STILL_TEST" ("PROF_DATA_15")
 INDEXTYPE IS "CTXSYS"."CONTEXT" PARAMETERS ('STOPLIST CTXSYS.EMPTY_STOPLIST');

ストップ リストの詳細については、次のリンクを参照してください。

http://docs.oracle.com/cd/A91202_01/901_doc/text.901/a90121/cdatadi9.htm

http://docs.oracle.com/cd/A91202_01/901_doc/text.901/a90121/astopsu2.htm#43324

奇妙なことに、上記のリンクによると、「まだ」という単語はデフォルトの停止リストに表示されません。

于 2012-09-25T07:40:37.580 に答える