我在Oracle 10g上使用Oracle Text。我创建了一个多列CONTEXT索引,如下所示:
我的桌子是
CREATE TABLE WEB_RES
(
"ID" NUMBER(10,0),
"TITLE" VARCHAR2(256 BYTE),
"DESCRIPTION" VARCHAR2(1024 BYTE),
"CONTENT" BLOB,
"CATEGORY" VARCHAR2(64 BYTE),
...
CONSTRAINT "PK_WEB_RES" PRIMARY KEY ("ID")
}
我的偏好和指数是:
execute ctx_ddl.create_preference('my_multi', 'MULTI_COLUMN_DATASTORE');
execute ctx_ddl.set_attribute('my_multi', 'columns', 'title, description, category');
execute ctx_ddl.create_preference( 'my_lexer', 'BASIC_LEXER' );
execute ctx_ddl.set_attribute('my_lexer', 'index_stems', '1');
create index myTitleIndex on web_res(title)
indextype is ctxsys.context
parameters ('DATASTORE my_multi lexer my_lexer SYNC(ON COMMIT)');
我的表格中有一行如下:
ID Title Description Category
--- ----------- -------------- ------------
1 Superannuation Contributions Splitting Test Test
英语不是我的母语,但该查询不应返回结果吗?
SELECT * FROM web_res WHERE CONTAINS(title, '$contribute', 1) > 0;
我希望找到一个标题为'贡献'在搜索' $ Contribute'或者通过'批准'找到标题。在搜索' $ approve'时。这不是什么原因造成的?
修改 我还尝试了如下的Basic_Wordlist,但仍然没有为我的查询返回任何行:
execute ctx_ddl.create_preference( 'my_wordlist', 'BASIC_WORDLIST' );
execute ctx_ddl.set_attribute('my_wordlist', 'stemmer', 'ENGLISH');
create index myTitleIndex on web_res(title)
indextype is ctxsys.context
parameters ('DATASTORE my_multi wordlist my_wordlist SYNC(ON COMMIT)');
答案 0 :(得分:2)
你可以尝试创建一个BASIC_WORDLIST,其中一个词干分析器首选项设置为英语吗?
http://docs.oracle.com/cd/B19306_01/text.102/b14218/cdatadic.htm#i1008929
好的,我已经为你更深入地研究了它,我不认为你会像他一样重新... 我使用了以下架构:
execute ctxsys.ctx_ddl.create_preference('my_multi','MULTI_COLUMN_DATASTORE');
execute ctxsys.ctx_ddl.set_attribute('my_multi','columns','a,b,c');
execute ctxsys.ctx_ddl.create_preference('my_lexer','BASIC_LEXER');
execute ctxsys.ctx_ddl.set_attribute('my_lexer','index_stems','1');
execute ctxsys.ctx_ddl.create_preference('my_wordlist','BASIC_WORDLIST');
execute ctxsys.ctx_ddl.set_attribute('my_wordlist','stemmer','ENGLISH');
create index tt on test(a) indextype is ctxsys.context parameters('DATASTORE my_multi WORDLIST my_wordlist LEXER my_lexer SYNC(on commit)');
insert into test values ('Superannuation Contributions Splitting','test','test');
insert into test values ('commit','Superannuation Contributions Splitting','test');
insert into test values ('commit','test','Superannuation Contributions Splitting');
commit;
因此,在创建架构后 - 我转到了DR $ INDEX_NAME $ I表,并查看了那里的数据。 它包含:B,C,提交,贡献,贡献,分裂,分裂,退休金,测试。 这意味着这些是"根"你可以搜索。
因为"贡献"不在这里,你不能"到达它"。
但是,如果您要搜索' $ contrib'你会发现它,甚至是" $ committing"因为它的根,提交,在列表中。
底线 - Oracle不知道贡献和贡献是相关的。这可能是引擎中的错误或语言属性(您永远不会知道)。
但是 - 我可以向你保证干预工作 - 因为搜索' $贡献'和' $ split'将返回结果......