为什么Oracle Text Stemming不起作用?

时间:2014-03-28 03:43:15

标签: oracle stemming oracle-text

我在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)');

1 个答案:

答案 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'将返回结果......