oracle全文索引之LEXER_2_CHINESE_LEXER
介紹完Oracle全文索引的BASIC_LEXER屬性,這篇介紹Oracle中文語法屬性CHINESE_LEXER和CHINESE_VGRAM_LEXER。
Oracle全文索引的BASIC屬性主要是針對西方英語語系,英語語系的單詞是透過空格、標點和回車來分隔的。而中文則需要索引來自動切詞。[@more@]2看下面這個例子:
SQL> CREATE TABLE T (ID NUMBER, DOCS VARCHAR2(1000));
表已建立。
SQL> INSERT INTO T VALUES (1, '一箇中文例子,測試BASIC_LEXER語法屬性是否可以正常識別中文。');
已建立 1 行。
SQL> COMMIT;
提交完成。
SQL> CREATE INDEX IND_T_DOCS ON T (DOCS) INDEXTYPE IS CTXSYS.CONTEXT;
索引已建立。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '中文') > 0;
未選定行
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '一箇中文例子') > 0;
ID DOCS
---------- ------------------------------------------------------------
1 一箇中文例子,測試BASIC_LEXER語法屬性是否可以正常識別中文。
透過BASIC_LEXER來索引中文,Oracle只識別被空格、標點和回車符分隔出來的部分。需要對中文內容進行索引的話,就必須使用中文的LEXER。
Oracle提供了兩種預定義的中文LEXER屬性:CHINESE_VGRAM_LEXER和CHINESE_LEXER。Oracle在文件上是這樣描述的:
CHINESE_LEXER相對應CHINESE_VGRAM_LEXER屬性有如下的優點:
產生的索引更小;
更好的查詢響應時間;
產生更接近真實的索引切詞,使得查詢精度更高;
支援停用詞。
雖然Oracle說明了使用CHINESE_LEXER的大量好處,但是CHINESE_LEXER的實際效果卻存在一定的問題:
SQL> DROP INDEX IND_T_DOCS;
索引已丟棄。
SQL> TRUNCATE TABLE T;
表已截掉。
SQL> INSERT INTO T VALUES (1, '北京大學未名湖');
已建立 1 行。
SQL> INSERT INTO T VALUES (2, '北京郵電大學');
已建立 1 行。
SQL> INSERT INTO T VALUES (3, '北京市第十四中學');
已建立 1 行。
SQL> COMMIT;
提交完成。
SQL> CONN CTXSYS/CTXSYS@YANGTK
已連線。
SQL> BEGIN
2 CTX_DDL.CREATE_PREFERENCE('TEST_CHINESE_VGRAM_LEXER', 'CHINESE_VGRAM_LEXER');
3 CTX_DDL.CREATE_PREFERENCE('TEST_CHINESE_LEXER', 'CHINESE_LEXER');
4 END;
5 /
PL/SQL 過程已成功完成。
SQL> CONN YANGTK/YANGTK@YANGTK
已連線。
SQL> CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('LEXER CTXSYS.TEST_CHINESE_VGRAM_LEXER');
索引已建立。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '北京') > 0;
ID DOCS
---------- ------------------------------------------------------------
3 北京市第十四中學
2 北京郵電大學
1 北京大學未名湖
SQL> DROP INDEX IND_T_DOCS;
索引已丟棄。
SQL> CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('LEXER CTXSYS.TEST_CHINESE_LEXER');
索引已建立。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '北京') > 0;
ID DOCS
---------- ------------------------------------------------------------
2 北京郵電大學
透過對比結果可以發現:使用CHINESE_LEXER 沒有將第一條記錄和第三條記錄中的北京檢索出來。也許Oracle的CHINESE_LEXER認為北京大學和北京市是一個完整的詞彙,而沒有對其進行進 一步切分。也許這就是Oracle提到的這種切分方式更接近於真實的情況。我不知道讀者會怎樣看待這個問題,不過我更傾向於使用 CHINESE_VGRAM_LEXER,個人感覺返回記錄多一些總比漏掉一些要好。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/271283/viewspace-1022231/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle全文索引之STORAGE PREFERENCEOracle索引
- oracle全文索引之WORDLIST PREFERENCEOracle索引
- oracle全文索引之幾個關鍵表Oracle索引
- oracle全文索引之commit與DML操作Oracle索引MIT
- oracle全文索引之如何實現查詢Oracle索引
- oracle全文索引之STOPLIST_4_MULTI_STOPLISTOracle索引
- oracle全文索引之STOPLIST_3_DEFAULT_STOPLISTOracle索引
- oracle全文索引之STOPLIST_2_EMPTY_STOPLISTOracle索引
- oracle全文索引之STOPLIST_1_BASIC_STOPLISTOracle索引
- oracle全文索引之LEXER_4_MULTI_LEXEROracle索引
- oracle全文索引之LEXER_3_DEFAULT_LEXEROracle索引
- oracle全文索引之LEXER_1_BASIC_LEXEROracle索引
- oracle全文索引之FILTER_4_PROCEDURE_FILTEROracle索引Filter
- oracle全文索引之FILTER_3_FORMAT_COLUMNOracle索引FilterORM
- oracle全文索引之FILTER_1_NULL_FILTEROracle索引FilterNull
- oracle全文索引之datastore_6_NESTED_DATASTOREOracle索引AST
- oracle全文索引之datastore_5_detail_datastoreOracle索引ASTAI
- oracle全文索引之datastore_4_URL_DATASTOREOracle索引AST
- oracle全文索引之datastore_3_FILE_DATASTOREOracle索引AST
- oracle全文索引之datastore_1_DIRECT_DATASTOREOracle索引AST
- Oracle:全文索引Oracle索引
- oracle全文索引之配置全文檢索環境Oracle索引
- oracle 之全文索引表的分割槽交換案例Oracle索引
- oracle全文索引之About_INDEX_THEMES操作Oracle索引Index
- oracle全文索引之STOPLIST_ CTXCAT 索引_INDEX SETOracle索引Index
- oracle全文索引之datastore_2_MULTI_COLUMN_DATASTOREOracle索引AST
- Oracle的全文索引Oracle索引
- ZT oracle全文索引Oracle索引
- oracle全文索引之SECTION GROUP_6_PATH_SECTION_GROUPOracle索引
- oracle全文索引之SECTION GROUP_5_AUTO_SECTION_GROUPOracle索引
- oracle全文索引之SECTION GROUP_4_XML_SECTION_GROUPOracle索引XML
- oracle全文索引之SECTION GROUP_3_HTML_SECTION_GROUPOracle索引HTML
- oracle全文索引之SECTION GROUP_2_BASIC_SECTION_GROUPOracle索引
- oracle全文索引之SECTION GROUP_1_NULL_SECTION_GROUPOracle索引Null
- oracle全文索引之FILTER_2_INSO_FILTEROracle索引Filter
- oracle 全文索引的配置Oracle索引
- MongoDB之索引(全文索引)MongoDB索引
- oracle全文索引之同步和優化索引做了什麼Oracle索引優化