3.3 Lexer 属性
Oracle 全文检索的lexer 属性用于处理各种不同的语言,最基本的英文使用basic_lexer,
中文则可以使用chinese_vgram_lexer 或chinese_lexer。
3.3.1 Basic_lexer
basic_lexer 属性支持如英语、德语、荷兰语、挪威语、瑞典语等以空格作为界限的语言(原
文:Use the BASIC_LEXER type to identify tokens for creating Text indexes for English and all
other supported whitespace-delimited languages.)
Create table my_lex (id number, docs varchar2(1000));
Insert into my_lex values (1, this is a example for the basic_lexer);
Insert into my_lex values (2, he following example sets Printjoin characters );
Insert into my_lex values (3, To create the INDEX with no_theme indexing and with printjoins characters);
Insert into my_lex values (4, 中华人民共和国);
Insert into my_lex values (5, 中国淘宝软件);
Insert into my_lex values (6, 测试basic_lexer 是否支持中文);
Commit;
/
--建立basic_lexer
begin
ctx_ddl.create_preference(mylex, BASIC_LEXER);
ctx_ddl.set_attribute (mylex, printjoins, _-); --保留_ -符号
ctx_ddl.set_attribute ( mylex, index_themes, NO);
ctx_ddl.set_attribute ( mylex, index_text, YES);
ctx_ddl.set_attribute (mylex,mixed_case,yes); --区分大小写
end;
create index indx_m_lex on my_lex(docs) indextype is ctxsys.context parameters(lexer
mylex);
Select id from my_lex where contains(docs, no_theme) > 0;
select docs from my_lex where contains(docs,中国)>0
3.3.2 Mutil_lexer
支持多种语言的文档,比如你可以利用这个lexer 来定义包含Endlish,German 和Japanese 的
文档(原文:Use MULTI_LEXER to index text columns that contain documents of different
languages. For example, you can use this lexer to index a text column that stores English, German,
and Japanese documents.)建立一个multi_lexer 属性的索引,并通过language 列设置需要索
引的语言,Oracle 会根据language 列的内容去匹配add_sub_lexer 过程中指定的语言标识符,如果匹配的上,就使用该sub_lexer 作为索引的lexer,如果没有找到匹配的,就使用default语言作为索引的lexer 列,注意客户端nls_language,可能会影响lexer 的选择
Select * from v$nls_parameters where parameter = NLS_LANGUAGE;
alter session set nls_language=simplified chinese;
alter session set nls_language=american;
例子:
create table globaldoc ( doc_id number primary key,lang varchar2(3),text clob);
--建立multi_lexer
begin
ctx_ddl.create_preference(english_lexer,basic_lexer);
ctx_ddl.set_attribute(english_lexer,index_themes,yes);
ctx_ddl.set_attribute(english_lexer,theme_language,english);
ctx_ddl.create_preference(german_lexer,basic_lexer);
ctx_ddl.set_attribute(german_lexer,composite,german);
ctx_ddl.set_attribute(german_lexer,mixed_case,yes);
ctx_ddl.set_attribute(german_lexer,alternate_spelling,german);
ctx_ddl.create_preference(japanese_lexer,japanese_vgram_lexer);
ctx_ddl.create_preference(global_lexer, multi_lexer);
ctx_ddl.add_sub_lexer(global_lexer,default,english_lexer);
ctx_ddl.add_sub_lexer(global_lexer,german,german_lexer,ger);
ctx_ddl.add_sub_lexer(global_lexer,japanese,japanese_lexer,jpn);
end;
create index globalx on globaldoc(text) indextype is ctxsys.context
parameters (lexer global_lexer language column lang);
3.3.3 chinese_vgram_lexer 和chinese_lexer
basic_lexer 只能识别出被空格、标点和回车符分隔出来的部分,如果要对中文内容进行索引的话,就必须使用chinese_vgram_lexer 或是chinese_lexer
Chinese_lexer 相比chinese_vgram_lexer 有如下的优点:
产生的索引更小
更好的查询响应时间
产生更接近真实的索引切词,使得查询精度更高
支持停用词
因为chinese_lexer 采用不同的算法来标记tokens, 建立索引的时间要比chinese_vgram_lexer
长.
字符集:支持al32utf8,zhs16cgb231280,zhs16gbk,zhs32gb18030,zht3