ORACLE TEXT LEXER PREFERENCE(四)
本文繼續介紹Oracle全文索引的LEXER屬性,這篇文章介紹Oracle多語言全文索引DEFAULT_LEXER。
其實這篇文章應該放在LEXER屬性的開頭部分,不過我的測試一直和Oracle文檔上的描述不符,所以一直沒有寫這篇文章,今天找了個環境又測試了一下,基本上可以推出肯定的答案,因此,這才補上這篇。
要是DEFAULT_LEXER其實并不復雜,但是確實最常使用的,無論是明確給出DEFAULT_LEXER屬性還是不指定LEXER屬性,Oracle都會使用DEFAULT_LEXER作為LEXER的默認屬性。
但是DEFAULT_LEXER并不是一個真正意義上的LEXER,Oracle9i的文檔上描述的是,如果數據庫在建立的時候指定的是中文則DEFAULT_LEXER為CHINESE_VGRAM_LEXER,如果是英文,則DEFAULT_LEXER為BASIC_LEXER。
但是我在很多Oracle9i的環境下進行測試,發現無論按照時指定中文還是英文,DEFAULT_LEXER的值都是BASIC_LEXER。
SQL> CONN SYSTEM/MANAGER@DEMO2已連接。
SQL> SELECT NAME, VALUE$ FROM SYS.PROPS$ WHERE NAME = 'NLS_LANGUAGE';
NAME VALUE$
---------------------------------------- --------------------
NLS_LANGUAGE SIMPLIFIED CHINESE
SQL> CREATE TABLE T (ID NUMBER, DOCS VARCHAR2(1000));
表已創建。
SQL> INSERT INTO T VALUES (1, '一個中文例子,測試默認的語法屬性是否可以正常識別中文。');
已創建?1?行。
SQL> INSERT INTO T VALUES (2, '根據Oracle的文檔,數據庫的默認語言是中文會采用CHINA_VGRAM_LEXER。');
已創建?1?行。
SQL> COMMIT;
提交完成。
SQL> CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('LEXER CTXSYS.DEFAULT_LEXER');
索引已創建。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '中文') > 0;
未選定行
SQL> SELECT PRE_NAME, PRE_OBJECT FROM CTX_PREFERENCES WHERE PRE_NAME = 'DEFAULT_LEXER';
PRE_NAME PRE_OBJECT
------------------------------ ------------------------------
DEFAULT_LEXER BASIC_LEXER
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production PL/SQL Release 9.2.0.4.0 - Production
CORE 9.2.0.3.0 Production
TNS for Linux: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production
看來Oracle的文檔在這里的描述有問題,或者Oracle的實現上和文檔不一致。
但是測試發現Oracle10.2.0中,如果按照的時候選擇了中文,則DEFAULT_LEXER屬性的值為CHINESE_VGRAM_LEXER。
SQL> CONN YANGTK/YANGTK@YTK已連接。
SQL> SELECT NAME, VALUE$ FROM SYS.PROPS$ WHERE NAME = 'NLS_LANGUAGE';
NAME VALUE$
---------------------------------------- --------------------
NLS_LANGUAGE SIMPLIFIED CHINESE
SQL> CREATE TABLE T (ID NUMBER, DOCS VARCHAR2(1000));
表已創建。
SQL> INSERT INTO T VALUES (1, '一個中文例子,測試默認的語法屬性是否可以正常識別中文。');
已創建?1?行。
SQL> INSERT INTO T VALUES (2, '根據Oracle的文檔,數據庫的默認語言是中文會采用CHINA_VGRAM_LEXER。');
已創建?1?行。
SQL> COMMIT;
提交完成。
SQL> CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('LEXER CTXSYS.DEFAULT_LEXER');
索引已創建。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '中文') > 0;
ID DOCS
---------- ------------------------------------------------------------------
1?一個中文例子,測試默認的語法屬性是否可以正常識別中文。
2?根據Oracle的文檔,數據庫的默認語言是中文會采用CHINA_VGRAM_LEXER。
SQL> SELECT PRE_NAME, PRE_OBJECT FROM CTX_PREFERENCES WHERE PRE_NAME = 'DEFAULT_LEXER';
PRE_NAME PRE_OBJECT
------------------------------ ------------------------------
DEFAULT_LEXER CHINESE_VGRAM_LEXER
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
總結
以上是生活随笔為你收集整理的ORACLE TEXT LEXER PREFERENCE(四)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ORACLE TEXT LEXER PR
- 下一篇: 在11g中alter system se