当前位置:  数据库>oracle

Oracle全文索引使用方法

    来源: 互联网  发布时间:2017-06-03

    本文导语: 接近千万数据表中有个name字段,存放中文名称,现在需要根据name字段模糊匹配查询数据,一般的做法是对name字段建立b*tree索引,查询用like'%name%',但是经过测试,这种写法没有走索引,而是全表扫描,可想而知性能有问题。所...

接近千万数据表中有个name字段,存放中文名称,现在需要根据name字段模糊匹配查询数据,一般的做法是对name字段建立b*tree索引,查询用like'%name%',但是经过测试,这种写法没有走索引,而是全表扫描,可想而知性能有问题。所以采用了Oracle提供的全文索引技术,下面详细介绍下如何使用全文索引。

相关阅读:

由Oracle索引来理解ArcSDE索引

Oracle索引技术之如何建立最佳索引

Oracle索引列NULL值引发执行计划该表的测试示例

Oracle索引 主键影响查询速度

Oracle索引扫描

1.使用前提

1) 检查数据库中是否有CTXSYS用户(从dba_users)和CTXAPP角色(dba_roles)。如果没有这个用户和角色,意味着你的数据库创建时未安装intermedia功能。你必须修改数据库以安装这项功能。

2) 把CTXAPP角色赋于当前用户: GRANT CTXAPP TO 当前用户;

3) 把CTX_DDL的执行权限赋于当前用户: GRANT EXECUTE ON CTX_DDL TO 当前用户;

2.创建分析器

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

oracle text中的分析器有3种:

1) basic_lexer:针对英文,只能根据空格和标点来进行拆分。比如“中国深圳”,只能拆分为“中国深圳”一个词,根据“中国”或者“深圳”就搜索不到。

2) chinese_vgram_lexer:专门的汉语分析器,按字单元进行拆分,比如“中国深圳”,可以拆分为“中”、“中国“、”国深”、“深圳”、“圳”五个词组。这种方式的好处是能够将所有有可能的词组全部保存进索引表,使得数据不会遗漏,但是效率上来说就差强人意了。

3) chinese_lexer:一种新的汉语分析器,能够认识大部分常用的汉语词汇,较与chinese_vgram_lexer机械式的拆分,能够按常用词汇进行拆分存储。比如“中国深圳”,只会被拆分为“中国”、“深圳”两个词组。

具体语法为:

ctx_ddl.drop_preference('testlex');--删除

ctx_ddl.create_preference('testlex','CHINESE_LEXER');--创建一个“CHINESE_LEXER”分析器,名称为“testlex”

3.创建过滤词组

假设根据公司名称进行检索,一般情况下我们不希望,当输入“公司”、“股份公司”、“有限公司”等能够检索出来结果,所以需要对这些关键字进行过滤。当然如果没有这种特殊的需求,可以不用创建过滤词组的。

1) 创建一个过滤器,名称为“teststoplist”

exec ctx_ddl.create_stoplist('teststoplist');

2) 添加自定义需要过滤的词组,以下内容的意思是“公司”、“股份公司”、“有限公司”这些词组不会创建索引,不会被检索到。

ctx_ddl.add_stopword('teststoplist','有限公司');

ctx_ddl.add_stopword('teststoplist','公司');

ctx_ddl.add_stopword('teststoplist','股份公司');

4.创建索引

create index idx_test  on test(name) indextype is CTXSYS.CONTEXT parameters('lexertestlex stoplistteststoplist');

以上语句的意思是在test表name字段上创建全文索引,索引类型为CTXSYS.CONTEXT,用到了上面创建的分析器“testlex”、过滤词组“teststoplist”。

创建完索引之后,可以看到生成了如下几个表:dr$idx_test$i;dr$idx_test$k;dr$idx_test$n;dr$idx_test$r;其中dr$idx_test$i表存放的就是name字段分词后的数据。

5.使用索引

oracle全文索引使用时,sql语句必须使用contains关键字,具体如下:

select * from test where contains(name,'深圳') > 0;

如果需要根据匹配程度来排序,如下:

select score(1),t.* from test t where contains(name,'深圳',1)>0 order by score(1) desc;

6.索引维护

对表的dml操作是不会更新全文索引的,这个也是全文索引的一个特点,索引我们必须手动去维护索引,具体写法如下:

exec ctx_ddl.sync_index('IDX_TEST');--同步索引,将新的数据同步到索引

exec ctx_ddl.optimize_index('IDX_TEST','FULL');--优化索引,清楚已删除的数据

总结:Oracle全文索引是一种用空间换取时间的一种技术,再加上dml操作不能自动同步到索引,需要手动定期维护,所以适用场景也不是很广泛。因此,选择使用时请慎重。


    
 
 

您可能感兴趣的文章:

  • linux下安装oracle后使用命令行启动的方法 linux启动oracle
  • oracle中UPDATE nowait 的使用方法介绍
  • oracle10g全文索引自动同步语句使用方法
  • Linux下Oracle的sqlplus使用光标上下左右方法
  • oracle关键字作为字段名使用方法
  • c#中oracle的to_date函数使用方法
  • oracle使用instr或like方法判断是否包含字符串
  • SQL Server中使用Linkserver连接Oracle的方法
  • oracle数据库导入导出命令使用方法
  • oracle冷备份恢复和oracle异机恢复使用方法
  • 使用Oracle数据挖掘API方法详解[图文]
  • oracle trunc()函数的使用方法
  • oracle11gR2使用exp导出命令时报EXP-00011错误的解决方法
  • oracle中decode函数的使用方法
  • [Oracle] dbms_metadata.get_ddl 的使用方法总结
  • 关于Oracle数据库中快照的使用方法介绍
  • Oracle中instr函数使用方法
  • Oracle 分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法
  • oracle 使用sql获取数据库表、表的字段的多种方法
  • oracle排名函数的使用方法分享
  • Oracle与Mysql主键、索引及分页的区别小结
  • 从Oracle的约束到索引
  • Oracle 9i轻松取得建表和索引的DDL语句
  • Oracle9i取得建表和索引的DDL语句
  • Oracle建立二进制文件索引的方法
  • 在Oracle 10g中如何获得索引的专家建议
  • Oracle全文索引设置
  • 用Oracle 9i全索引扫描快速访问数据
  • Oracle中如何把表和索引放在不同的表空间里
  • Oracle索引存储关系到数据库的运行效率
  • Oracle索引聚簇表的数据加载
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • ORACLE 中修改用户密码的方法
  • Linux下完全卸载ORACLE 10G的方法
  • 将Oracle 8i数据成功移植Oracle 10g的方法
  • Oracle Connect to Idle Instance解决方法
  • oracle增加表空间大小两种实现方法
  • linux下用ODBC链接Oracle怎么连啊?跪求具体方法!!!
  • Linux系统下查看oracle SID的方法
  • oracle 彻底删除方法
  • window中oracle环境变量设置方法分享
  • Oracle 忘记密码的找回方法
  • oracle的job不能运行问题的解决方法
  • Linux下Oracle 10G DBCA等汉字乱码解决方法
  • Oracle中serveroutput参数一次设置永久保存方法
  • Oracle指定IP访问数据库方法
  • Oracle SID存在解決方法
  • 登录oracle数据库时密码忘记的解决方法
  • PB7 连接 Oracle 的设置方法
  • Oracle删除后不能重新安装的解决方法
  • oracle删除文件后数据库启动不了的处理方法
  • 跪求UNIX 下C用OCI连接ORACLE方法。高手进!!!
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,