1

我在 Oracle 10g 上使用 Oracle Text。我创建了一个多列上下文索引,如下所示:

我的桌子是

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”时找到带有“Contribution”的标题,或者在搜索“$approve”时找到带有“approval”的标题。这不就是词干的意义吗?

编辑: 我也尝试了下面的 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)');
4

1 回答 1

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、commit、contribution、contributions、split、splitting、superannuation、test。这意味着这些是您可以搜索的“根”列表。

由于“贡献”不在这里,你不能“得到它”。

但是,如果您搜索“$contribution”,您会找到它,甚至可以搜索“$committing”,因为它的根commit,在列表中。

底线 - Oracle 不知道贡献和贡献是相关的。这要么是引擎中的错误,要么是语言属性(您永远无法知道)。

但是 - 我可以向你保证词干的工作 - 因为搜索 '$contribution' 和 '$split' 将返回结果......

于 2014-03-28T04:57:31.130 回答