上一篇文章中已经提到了,DEFAULT_STOPLIST的语言是由DEFAULT_LEXER决定的。Oracle对于多语言的文档支持MULTI_LEXER,同时也支持MULTI_STOPLIST。
在增加同义词的时候,可以为某个停用词指定语言,这个停用词就只对指定的语言生效。而默认不指定语言的情况,则对任何语言都生效。
SQL> CREATE TABLE T (ID NUMBER, LANGUAGE VARCHAR2(7), DOCS VARCHAR2(1000));
表已创建。
SQL> INSERT INTO T VALUES (1, 'ENGLIST', 'THIS IS A MULTI_STOPLIST EXAMPLE.');
已创建 1 行。
SQL> INSERT INTO T VALUES (2, 'CHINESE', '这个例子是多语言停用词的自理。');
已创建 1 行。
SQL> INSERT INTO T VALUES (3, 'ENGLIST', 'TO USE MULTI_STOPLIST FIRST USE MULTI_LEXER.');
已创建 1 行。
SQL> INSERT INTO T VALUES (4, 'CHINESE', '使用多语言停用词首先要使用多语言LEXER。');
已创建 1 行。
SQL> COMMIT;
提交完成。
SQL> CONN CTXSYS/CTXSYS@YANGTK
已连接。
SQL> BEGIN
2 CTX_DDL.CREATE_PREFERENCE('TEST_CHINESE_VGRAM', '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_VGRAM');
索引已创建。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'LEXER') > 0;
ID LANGUAG DOCS
---------- ------- --------------------------------------------------
4 CHINESE 使用多语言停用词首先要使用多语言LEXER。
3 ENGLIST TO USE MULTI_STOPLIST FIRST USE MULTI_LEXER.
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '首先') > 0;
ID LANGUAG DOCS
---------- ------- --------------------------------------------------
4 CHINESE 使用多语言停用词首先要使用多语言LEXER。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'THIS') > 0;
未选定行
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '语言') > 0;
ID LANGUAG DOCS
---------- ------- --------------------------------------------------
4 CHINESE 使用多语言停用词首先要使用多语言LEXER。
2 CHINESE 这个例子是多语言停用词的自理。
SQL> DROP INDEX IND_T_DOCS;
索引已丢弃。
上面是不指定停用词的情况,如果将‘LEXER’添加的默认停用词中,则会同时影响记录3和记录4。
SQL> CONN CTXSYS/CTXSYS@YANGTK
已连接。
SQL> BEGIN
2 CTX_DDL.ADD_STOPWORD('DEFAULT_STOPLIST', '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_VGRAM');
索引已创建。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'LEXER') > 0;
未选定行
SQL> DROP INDEX IND_T_DOCS;
索引已丢弃。
而如果建立了MULTI_STOPLIST,并在增加STOPWORD的时候指定语言,则停用词只对指定的语言生效。
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_VGRAM_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 CTX_DDL.CREATE_STOPLIST('TEST_MULTI', 'MULTI_STOPLIST');
9 CTX_DDL.ADD_STOPWORD('TEST_MULTI', 'LEXER', 'ENGLISH');
10 CTX_DDL.ADD_STOPWORD('TEST_MULTI', '首先', 'SIMPLIFIED CHINESE');
11 END;
12 /
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 STOPLIST CTXSYS.TEST_MULTI');
索引已创建。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'LEXER') > 0;
ID LANGUAG DOCS
---------- ------- --------------------------------------------------
4 CHINESE 使用多语言停用词首先要使用多语言LEXER。
3 ENGLIST TO USE MULTI_STOPLIST FIRST USE MULTI_LEXER.
SQL> ALTER SESSION SET NLS_LANGUAGE = 'ENGLISH';
Session altered.
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'LEXER') > 0;
no rows selected
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, 'THIS') > 0;
ID LANGUAG DOCS
---------- ------- --------------------------------------------------
1 ENGLIST THIS IS A MULTI_STOPLIST EXAMPLE.
SQL> ALTER SESSION SET NLS_LANGUAGE = 'SIMPLIFIED CHINESE';
会话已更改。
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '首先') > 0;
SELECT * FROM T WHERE CONTAINS(DOCS, '首先') > 0
*
ERROR 位于第 1 行:
ORA-29902: 执行 ODCIIndexStart() 例行程序中出错
ORA-20000: Oracle Text error:
DRG-10817: CONTAINS 搜索词包含禁用词或禁用词的词组: 首先
SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '语言') > 0;
ID LANGUAG DOCS
---------- ------- -------------------------------------------------
4 CHINESE 使用多语言停用词首先要使用多语言LEXER。
2 CHINESE 这个例子是多语言停用词的自理。
可以看到,由于LEXER 被添加到英文的停用词中,因此,使用中文环境进行查询的时候是可以查询到记录的,而将环境切换到ENGLISH语言中,则无法查询到记录,说明停用词只对 英语有效。这里需要注意的是,由于定义的时候指定的是ENGLISH,则切换环境的时候也要切换到ENGLISH,DEFAULT_STOPLIST和 DEFAULT_LEXER不同,如果将语言切换为AMERICAN,则LEXER属性可以兼容并继续工作,而定义在ENGLISH语言中的停用词对 AMERICAN环境无效。
最后由于TEST_MULTI是用户定义的停用词,不包含系统默认的停用词,因此对THIS的查询可以返回记录。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/271283/viewspace-1022482/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/271283/viewspace-1022482/