Oracle全文索引之二 创建

###创建

####创建索引的准备工作

#####测试环境

  • 在测试用户myoralce用户下执行:

      create table YU_TEST(  
    

id number,  
     name varchar2(50)  
);

  • 插入测试数据:

      insert into YU_TEST values(1,'重庆市沙坪坝区');  
      insert into YU_TEST values(2,'成都市青羊区');  
      insert into YU_TEST values(3,'北京市西城区');  
      insert into YU_TEST values(4,'重庆市两江新区');  
      insert into YU_TEST values(5,'上海市浦东新区金桥镇');  
      insert into YU_TEST values(6,'上海东方明珠');  
      insert into YU_TEST values(7,'江苏省无锡市国家软件园');  
      insert into YU_TEST values(8,'成都市天府软件园'); 
    

#####解锁ctxsys用户和授权

  • 检查和设置数据库角色首先检查数据库中是否有CTXSYS用户和CTXAPP角色。如果没有这个用户和角色,意味着你的数据库创建时未安装intermedia功能。你必须修改数据库以安装这项功能。 默认安装情况下,ctxsys用户是被锁定的,因此要先启用ctxsys的用户。以system用户进入sqlplus,执行如下命令解锁ctxsys用户:

      alter user ctxsys account unlock;
    
  • 将ctx_ddl包的操作权限赋予myoracle用户。(system用户下执行)

      grant execute on ctx_ddl to myoracle;
    

#####创建分词器

oracle text的分析器,类似于lucene中的分词器,将需要检索的记录,按照一定的方式进行词组拆分,然后存放在索引表中。检索的时候根据索引表中存放的拆分词组,对传入的关键字进行匹配,并返回匹配结果。

oracle text中的分析器有3种:

  • basic_lexer:只能根据空格和标点来进行拆分。比如“中国重庆”,只能拆分为“中国重庆”一个词组

  • chinese_vgram_lexer:专门的汉语分析器,按字单元进行拆分,比如“中国重庆”,可以拆分为“中”、“中国“、”国重”、“重庆”、“庆”五个词组。这种方式的好处是能够将所有有可能的词组全部保存进索引表,使得数据不会遗漏。

  • chinese_lexer:一种新的汉语分析器,能够认识大部分常用的汉语词汇,并按常用词汇进行拆分存储。比如“中国重庆”,只会被拆分为“中国”、“重庆”两个词组。

本文档的测试使用chinese_vgram_lexer分析器。

myoracle用户登陆,执行命令:

exec ctx_ddl.create_preference ('my_lexer', 'chinese_vgram_lexer'); 

这句话的意思是创建一个名为“my_lexer”的“chinese_vgram_lexer”分析器。

以上就是创建全文索引的准备工作,下面就可以创建索引了。

####创建全文索引

创建全文索引的语法:

CREATE INDEX [schema.]index on [schema.]table(column) INDEXTYPE IS ctxsys.context [ONLI    NE] LOCAL [(PARTITION [partition] [PARAMETERS('paramstring')] [, PARTITION [partition]     [PARAMETERS('paramstring')]])] [PARAMETERS(paramstring)] [PARALLEL n] [UNUSABLE];

myoracle用户下执行:

create index YU_TEST_INDEX on YU_TEST(name) indextype is CTXSYS.CONTEXT parameters('lex    er my_lexer');

这句话的意思就是,在YU_TEST_INDEX表中的name字段上创建索引,索引类型为context类型,该索引用到的分析器为前面定义的my_lexer。

索引创建之后,在当前用户会多出四张表:DR Y U T E S T I N D E X YU_TEST_INDEX YUTESTINDEXI,DR Y U T E S T I N D E X YU_TEST_INDEX YUTESTINDEXK,DR Y U T E S T I N D E X YU_TEST_INDEX YUTESTINDEXN,DR Y U T E S T I N D E X YU_TEST_INDEX YUTESTINDEXR

其中,我们比较关心的是DR Y U T E S T I N D E X YU_TEST_INDEX YUTESTINDEXI这张表,因为name字段被拆分的词组就会保存在dr Y U T E S T I N D E X YU_TEST_INDEX YUTESTINDEXi表中。

可以通过下面的sql语句查看当前name字段拆分后的词组保存在DR Y U T E S T I N D E X YU_TEST_INDEX YUTESTINDEXI的情况:

SELECT token_text, token_count FROM dr$YU_TEST_INDEX$i

至此,全文索引就创建完毕了。下面就可以使用contains进行检索了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值