本文继续介绍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