首页 > 数据库 >【引用】Oracle全文检索方面的研究(全3)

【引用】Oracle全文检索方面的研究(全3)

时间:2023-09-21 11:34:52浏览次数:43  
标签:chinese lexer ctx 全文检索 lex 引用 ddl Oracle my


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,zht32euc,zht16big5

zht32tris, zht16mswin950,zht16hkscs,utf8

--建立chinese lexer
Begin
ctx_ddl.create_preference('my_chinese_vgram_lexer', 'chinese_vgram_lexer');
ctx_ddl.create_preference('my_chinese_lexer', 'chinese_lexer');
End;
-- chinese_vgram_lexer
Create index ind_m_lex1 on my_lex(docs) indextype is ctxsys.context Parameters ('lexer foo.my_chinese_vgram_lexer');
Select * from my_lex t where contains(docs, '中国') > 0;
-- chinese_lexer
drop   index ind_m_lex1 force;  
Create index ind_m_lex2 on my_lex(docs) indextype is ctxsys.context
Parameters ('lexer ctxsys.my_chinese_lexer');
Select * from my_lex t where contains(docs, '中国') > 0;

3.3.4 User_lexer

Use USER_LEXER to plug in your own language-specific lexing solution. This enables you to

define lexers for languages that are not supported by Oracle Text. It also enables you to define a

new lexer for a language that is supported but whose lexer is inappropriate for your application.

 

3.3.5 Default_lexer

如果数据库在建立的时候指定的是中文则default_lexer 为chinese_vgram_lexer,如果是英文,则default_lexer 为basic_lexer

 

3.3.6 Query_procedure

This callback stored procedure is called by Oracle Text as needed to tokenize words in the query.

A space-delimited group of characters (excluding the query operators) in the query will be

identified by Oracle Text as a word.

 

3.3.7 参考脚本

--建立basic_lexer
begin
ctx_ddl.create_preference('mylex', 'BASIC_LEXER');
ctx_ddl.set_attribute ('mylex', 'printjoins', '_-'); --保留_ -符号
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');
--建立 chinese_vgram_lexer 或是chinese_lexer
Begin
ctx_ddl.create_preference('my_chinese_vgram_lexer', 'chinese_vgram_lexer');
ctx_ddl.create_preference('my_chinese_lexer', 'chinese_lexer');
End;
-- chinese_vgram_lexer
Create index ind_m_lex1 on my_lex(docs) indextype is ctxsys.context
Parameters ('lexer ctxsys.my_chinese_vgram_lexer');

标签:chinese,lexer,ctx,全文检索,lex,引用,ddl,Oracle,my
From: https://blog.51cto.com/u_16255870/7552204

相关文章

  • 【引用】Oracle全文检索方面的研究(全6)
    3.6Wordlist属性Oracle全文检索的wordlist属性用来设置模糊查询和同词根查询,wordlist属性还支持子查询和前缀查询,oracle的wordlist属性只有basic_wordlist一种(原文:Usethewordlistpreferencetoenablethequeryoptionssuchasstemming,fuzzymatchingforyourlang......
  • 【引用】Oracle全文检索方面的研究(全2)
    3.2Filter属性过滤器负责将各种文件格式的数据转换为纯文本格式,索引管道中的其他组件只能处理纯文本数据,不能识别microsoftword或excel等文件格式,filter有charset_filter、inso_filter、null_filter、user_filter、procedure_filter几种类型。(可将文档格式转化为数据库文......
  • 【引用】Oracle全文检索方面的研究(全9)
    3.10常用的脚本3.10.1.删除preference:beginctx_ddl.drop_preference('my_lexer');end; 3.10.2.索引重建:ALTERINDEXnewsindexREBUILDPARAMETERS('replacelexermy_lexer'); 3.10.3同步索引beginctx_ddl.sync_index('myindex','2M');end;或通过后......
  • oracle查看实例EM端口号、SID设制与一些命令
    一、查看数据库实例的EM端口在ORACLE_HOME\install\portlist.ini文件里面。二、设制数据库实例的SIDSID的长度不能超过8个字符。实例名不能超过30个字符三、常用的一些命令启动/关闭EM:emctlstart/stopdbconsole启动/关闭监听:lsnrctlstart/stop创......
  • oracle 9i 建立oracle 10g dblink
    在oracle9i的机器的tnsnames.ora里配置10g的服务名为:ora10g=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=ip)(PORT=1522)))(CONNECT_DATA=(SERVICE_NAME......
  • Oracle表空间操作详解(备份)
    建立表空间CREATETABLESPACEdata01DATAFILE'/oracle/oradata/db/DATA01.dbf'SIZE500MUNIFORMSIZE128k;#指定区尺寸为128k,如不指定,区尺寸默认为64k删除表空间DROPTABLESPACEdata01INCLUDINGCONTENTSANDDATAFILES;修改表空间大小alterdatabasedatafile'/path/NADD......
  • Oracle正则表达式函数
    1、正则表达式中的元字符元字符意思例子\说明要匹配的字符是一个特殊字符、常量或者后者引用。(后引用重复上一次的匹配)\n匹配换行符\\匹配\\(匹配(\)匹配)^匹配字符串的开头位置如果A是字符串的第一个字符,^A匹配A$匹配字符串的末尾位置如果B是字符......
  • Oracle的差异增量备份和累积增量备份
    在rman增量备份中,有差异增量和累积增量的概念   1、概念    差异增量:是备份上级及同级备份以来所有变化的数据块,差异增量是默认增量备份方式    累积增量:是备份上级备份以来所有变化的块   因为累积增量是备份上级备份以来所有变化的数据块,所以累积增量需要更......
  • Java 的值传递与引用传递
     实参与形参我们都知道,在Java中定义方法的时候是可以定义参数的。比如Java中的main方法,publicstaticvoidmain(String[]args),这里面的args就是参数。参数在程序语言中分为形式参数和实际参数。形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时......
  • 知识库系统推荐,强大的全文检索与文档分类管理功能
    在我们日常企业运营管理过程中,会积累大量的文档资料,对于我们全体成员来说,这些知识文档都是巨大的财富,所以整合并搭建一套知识库系统是非常有必要的。 知识库系统推荐我们日常工作中产生大量的文档,随着存储技术的进步,使得存储文件的成本越来越低。最终,几乎所有的文档,都被积累下来。......