Oracle全文檢索之中文

cow977發表於2011-06-20

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章