在Oracle数据库10g和Oracle Database Express 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;
答案 0 :(得分: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
奇怪的是,根据上面的链接,“静止”一词不会出现在默认停止列表中。