Oracle全文检索之中文

Oracle全文检索之Contexthttp://space.itpub.net/81227/viewspace-692318

Oracle全文检索之Ctxcat 索引:http://space.itpub.net/81227/viewspace-692471

 

 

通过BASIC_LEXER来索引中文,Oracle只识别被空格、标点和回车符分隔出来的部分。需要对中文内容进行索引的话,就必须使用中文的LEXER

Oracle提供了两种预定义的中文LEXER属性:CHINESE_VGRAM_LEXERCHINESE_LEXER

Oracle在文档上是这样描述的:

CHINESE_LEXER相对应CHINESE_VGRAM_LEXER属性有如下的优点:

产生的索引更小;

更好的查询响应时间;

产生更接近真实的索引切词,使得查询精度更高;

支持停用词。

 

 

SQL> CREATE TABLE T (ID NUMBER, DOCS VARCHAR2(1000));

 

Table created

 

SQL> INSERT INTO T VALUES (1, '一个中文例子,测试BASIC_LEXER语法属性是否可以正常识别中文。');

 

1 row inserted

 

SQL> commit;

 

Commit complete

 

SQL> CREATE INDEX IND_T_DOCS ON T (DOCS) INDEXTYPE IS CTXSYS.CONTEXT;

 

Index created

 

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '中文') > 0;

 

        ID DOCS

---------- ----------------------------------------------------------------------

 

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '一个中文例子') > 0;

 

        ID DOCS

---------- ----------------------------------------------------------------------

         1 一个中文例子,测试BASIC_LEXER语法属性是否可以正常识别中文。

 

SQL>  DROP INDEX IND_T_DOCS;

 

Index dropped

 

SQL> TRUNCATE TABLE T;

 

Table truncated

 

SQL> INSERT INTO T VALUES (1, '北京大学未名湖');

 

1 row inserted

 

SQL> INSERT INTO T VALUES (2, '北京邮电大学');

 

1 row inserted

 

SQL> INSERT INTO T VALUES (3, '北京市第十四中学');

 

1 row inserted

 

SQL> commit;

 

Commit complete

 

SQL> exec CTX_DDL.CREATE_PREFERENCE('TEST_CHINESE_VGRAM_LEXER', 'CHINESE_VGRAM_LEXER');

 

PL/SQL procedure successfully completed

 

SQL> exec CTX_DDL.CREATE_PREFERENCE('TEST_CHINESE_LEXER', 'CHINESE_LEXER');

 

PL/SQL procedure successfully completed

 

SQL> CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT

  2   PARAMETERS ('LEXER TEST_CHINESE_VGRAM_LEXER');

 

Index created

 

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '北京') > 0;

 

        ID DOCS

---------- ----------------------------------------------------------------------

         1 北京大学未名湖

         2 北京邮电大学

         3 北京市第十四中学

 

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '大学') > 0;

 

        ID DOCS

---------- ----------------------------------------------------------------------

         1 北京大学未名湖

         2 北京邮电大学

 

SQL> DROP INDEX IND_T_DOCS;

 

Index dropped

 

SQL> CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT

  2  PARAMETERS ('LEXER TEST_CHINESE_LEXER');

 

Index created

 

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '北京') > 0;

 

        ID DOCS

---------- ----------------------------------------------------------------------

         2 北京邮电大学

 

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '北京 or 北京市') > 0;

 

        ID DOCS

---------- ----------------------------------------------------------------------

         2 北京邮电大学

         3 北京市第十四中学

 

通过对比结果可以发现:使用CHINESE_LEXER没有将第一条记录和第三条记录中的北京检索出来。也许OracleCHINESE_LEXER认为北京大学和北京市是一个完整的词汇,而没有对其进行进一步切分。也许这就是Oracle提到的这种切分方式更接近于真实的情况。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/81227/viewspace-700233/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/81227/viewspace-700233/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值