【问题标题】:Why Oracle Text Stemming doesn't work?为什么 Oracle Text Stemming 不起作用?
【发布时间】:2014-03-28 03:43:14
【问题描述】:

我在 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”时找到带有“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)');

【问题讨论】:

    标签: oracle stemming oracle-text


    【解决方案1】:

    您能否尝试创建一个 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' 将返回结果......

    【讨论】:

    • (因为我现在没有可用的 Oracle 机器,如果它不能解决您的问题 - 我明天必须在 Oracle DB 上重现整个事情......)
    • 我已经尝试过了,但没有成功。结果是一样的。将更新我的问题以反映它。
    • 您是否也尝试过使用 BASIC_LEXER 并失败了?我想缩小范围,例如服务器配置问题等。
    • 感谢您对其进行详细测试。这正是我想听到的。我可以看到'$contribution' 将添加尾随's' 并且能够找到'contributions'。我不确定为什么使用“贡献”找不到它。如果它没有被索引,那是有道理的!看起来仍然像一个错误,因为我也在使用 Lucene.Net,它的词干可以使用“贡献”查询找到“贡献”。
    • 如果你真的很介意的话,你可以随时开一个SR,请Oracle解释一下……Oracle文本有它的bug,但是相比它的成本——这是非常成本的有效...由一些在线词典贡献是贡献的东西,这可能导致决定将贡献与贡献分开 - 但最好的答案可能来自语言学家或甲骨文......
    猜你喜欢
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 2017-04-11
    • 2023-03-19
    • 2020-09-24
    • 2023-03-15
    相关资源
    最近更新 更多