oracle全文索引之LEXER_4_MULTI_LEXER
本文繼續介紹Oracle全文索引的LEXER屬性,這篇文章介紹Oracle多語言全文索引MULTI_LEXER。
如果在Oracle中儲存多種語言,那麼在建立全文索引的時候就不能只是簡單的指定一個LEXER,而是要透過LANGUAGE COLUMN設定MULTI_LEXER。
[@more@]下面看一個簡單的例子:
SQL> CREATE TABLE T (ID NUMBER, LANGUAGE VARCHAR2(7), DOCS VARCHAR2(1000));
表已建立。
SQL> INSERT INTO T VALUES (1, 'english', 'This is a mixed language example.');
已建立 1 行。
SQL> INSERT INTO T VALUES (2, 'chinese', '中文資訊應該使用中文語言屬性CHINESE_VGRAM_LEXER進行索引');
已建立 1 行。
SQL> INSERT INTO T VALUES (3, 'chinese', '英文記錄雖然可以透過中文語言屬性CHINESE_VGRAM_LEXER繼續索引');
已建立 1 行。
SQL> INSERT INTO T VALUES (4, '', 'But all the words is indexed by UPPER FORMAT.');
已建立 1 行。
SQL> COMMIT;
提交完成。
SQL> CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('LEXER CTXSYS.BASIC_LEXER');
索引已建立。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '中文') > 0;
未選定行
如果使用BASIC_LEXER作為LEXER屬性的選項,那麼就無法對中文使用索引。
SQL> DROP INDEX IND_T_DOCS;
索引已丟棄。
SQL> CONN CTXSYS/CTXSYS@YANGTK
已連線。
SQL> BEGIN
2 CTX_DDL.CREATE_PREFERENCE('TEST_CHINESE_LEXER', 'CHINESE_VGRAM_LEXER');
3 END;
4 /
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_LEXER');
索引已建立。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '中文') > 0;
ID LANGUAG DOCS
---------- ------- ----------------------------------------------------------
3 chinese 英文記錄雖然可以透過中文語言屬性CHINESE_VGRAM_LEXER繼續索引
2 chinese 中文資訊應該使用中文語言屬性CHINESE_VGRAM_LEXER進行索引
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'INDEXED') > 0;
ID LANGUAG DOCS
---------- ------- ---------------------------------------------------------
4 But all the words is indexed by UPPER FORMAT.
如果使用CHINESE_VGRAM_LEXER 屬性的話,雖然可以對英文進行索引,但是中文LEXER無法進行屬性的設定,如果想要對英文進行大小寫敏感的查詢,使用 CHINESE_VGRAM_LEXER屬性是不行的,必須使用BASIC_LEXER,並進行MIXED_CASE屬性設定。
SQL> DROP INDEX IND_T_DOCS;
索引已丟棄。
SQL> CONN CTXSYS/CTXSYS@YANGTK
已連線。
SQL> BEGIN
2 CTX_DDL.CREATE_PREFERENCE('TEST_ENGLISH', 'BASIC_LEXER');
3 CTX_DDL.SET_ATTRIBUTE('TEST_ENGLISH', 'MIXED_CASE', 'YES');
4 CTX_DDL.CREATE_PREFERENCE('TEST_CHINESE', 'CHINESE_LEXER');
5 CTX_DDL.CREATE_PREFERENCE('TEST_MULTI_LEXER', 'MULTI_LEXER');
6 CTX_DDL.ADD_SUB_LEXER('TEST_MULTI_LEXER', 'DEFAULT', 'TEST_ENGLISH');
7 CTX_DDL.ADD_SUB_LEXER('TEST_MULTI_LEXER', 'SIMPLIFIED CHINESE', 'TEST_CHINESE', 'CHINESE');
8 END;
9 /
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_MULTI_LEXER LANGUAGE COLUMN LANGUAGE');
索引已建立。
建立一個MULTI_LEXER 屬性的索引,並透過LANGUAGE列設定需要索引的語言。Oracle會根據LANGUAGE列的內容去匹配ADD_SUB_LEXER過程中指定的語 言識別符號。如果匹配的上,就使用該SUB_LEXER作為索引的LEXER,如果沒有找到匹配的,就使用DEFAULT語言作為索引的LEXER列。
上面雖然建立了MULTI_LEXER索引,但是對多語言索引的查詢卻還存在一些額外的問題:
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '中文') > 0;
ID LANGUAG DOCS
---------- ------- ----------------------------------------------------------
3 chinese 英文記錄雖然可以透過中文語言屬性CHINESE_VGRAM_LEXER繼續索引
2 chinese 中文資訊應該使用中文語言屬性CHINESE_VGRAM_LEXER進行索引
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'INDEXED') > 0;
未選定行
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'indexed') > 0;
未選定行
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'FORMAT') > 0;
ID LANGUAG DOCS
---------- ------- ------------------------------------------------
4 But all the words is indexed by UPPER FORMAT.
透過上面的查詢結果可以推測出,BASIC_LEXER並沒有起作用。對於中文的查詢可以生效,但是對於字元大小寫敏感的查詢都不會生效。可以生效的查詢只是原文中就使用大寫的單詞。
這是由於當前客戶端的語言設定是簡體中文,這和索引中的一個SUB_LEXER相匹配,因此Oracle選擇了該LEXER的索引結果作為查詢的返回結果。下面將NLS_LANGUAGE設定為英文:
SQL> SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER = 'NLS_LANGUAGE';
PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_LANGUAGE SIMPLIFIED CHINESE
SQL> ALTER SESSION SET NLS_LANGUAGE = 'AMERICAN';
Session altered.
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '中文') > 0;
ID LANGUAG DOCS
---------- ------- -----------------------------------------------------------
3 chinese 英文記錄雖然可以透過中文語言屬性CHINESE_VGRAM_LEXER繼續索引
2 chinese 中文資訊應該使用中文語言屬性CHINESE_VGRAM_LEXER進行索引
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'INDEXED') > 0;
no rows selected
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'indexed') > 0;
ID LANGUAG DOCS
---------- ------- --------------------------------------------------------
4 But all the words is indexed by UPPER FORMAT.
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'FORMAT') > 0;
ID LANGUAG DOCS
---------- ------- --------------------------------------------------------
4 But all the words is indexed by UPPER FORMAT.
結果恢復了正常,如果將語言不設定為DEFAULT LEXER,而是設定索引包含的LEXER以外的語言,查詢也是正常的。
SQL> ALTER SESSION SET NLS_LANGUAGE = 'TRADITIONAL CHINESE';
Session altered.
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '中文') > 0;
ID LANGUAG DOCS
---------- ------- -----------------------------------------------------------
3 chinese 英文記錄雖然可以透過中文語言屬性CHINESE_VGRAM_LEXER繼續索引
2 chinese 中文資訊應該使用中文語言屬性CHINESE_VGRAM_LEXER進行索引
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'INDEXED') > 0;
no rows selected
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'indexed') > 0;
ID LANGUAG DOCS
---------- ------- -----------------------------------------------------------
4 But all the words is indexed by UPPER FORMAT.
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'FORMAT') > 0;
ID LANGUAG DOCS
---------- ------- -----------------------------------------------------------
4 But all the words is indexed by UPPER FORMAT.
這就是說,對於包含多種語言的全文索引需要額外的小心。尤其是客戶端的語言設定與全文索引中的非DEFAULT屬性的SUB_LEXER的語言一致的情況。這個時候查詢語句會僅返回當前語言下的索引記錄。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/271283/viewspace-1022233/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 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_3_DEFAULT_LEXEROracle索引
- oracle全文索引之LEXER_2_CHINESE_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索引優化