`
MauerSu
  • 浏览: 509246 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Oracle模糊查询之(4.采用全文索引解决模糊查询,给出具体步骤)采用全文索引解决模糊查询速度慢的问题[主文]

    博客分类:
  • J2SE
 
阅读更多
源:http://blog.csdn.net/haiross/article/details/12974887
评:
转自http://sandish.itpub.net/post/4899/464369



众所周知,使用 like 进行模糊查询速度极差,包括 like 'AAA%' ,like '%AAA',like '%AAA%',like '%A%A%'以及采用“_”进行单字符匹配的那些模糊查询。网上有很多文章讲到如何提高like查询,提到 like 'AAA%'能够使用到索引,而like '%AAA' ,使用创建反向函数的索引来提高查询效率。但一般情况下,是无法约定客户端采用哪种like查询,难道说把所有的这些情况都进行if判断吗?

为这个事情脑袋疼了无数次。最近,一客户“无理”要求对用户地址模糊查询速度太慢。在数十万的用户记录下查询,要求5秒之内必须查询到记录。

想破脑袋还是找不到方法。有同事找了本Lucene的书给我看,说是能解决。翻来覆去的看了2,3遍,始终想不出这玩意儿怎么用。

突然想到oracle也有全文索引一说,以前只是别人提起过这个词。与网上朋友一聊,说是似乎可以解决,但他忘了怎么用了。

半夜12点,赶紧爬起来,到google上查资料。还真有两下子,研究了几个小时,有所获。第二天白天没时间研究,晚上继续,最终把全文索引搞定,解决了模糊查询速度慢的问题,在数十万条用户数据中, 对用户地址进行模糊查询速度在2秒以内就能够查到。

-------------------------------------------------------------------------

以下是创建全文索引的方法(网上有文章提到使用图形化界面,我用图形化界面创建全文索引,创建了一个晚上,第二天起床居然还没完。但用SQL命令15分钟左右就搞定):

对cmng_custominfo 表中的address字段做全文检索:
1,在oracle9201中需要创建一个分词的东西:

BEGIN
ctx_ddl.create_preference ('SMS_ADDRESS_LEXER', 'CHINESE_LEXER');
--ctx_ddl.create_preference ('my_lexer', 'chinese_vgram_lexer'); 不用
end;

2,创建全文检索:

CREATE INDEX INX_CUSTOMINFO_ADDR_DOCS ON cmng_custominfo(address) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ('LEXER SMS_ADDRESS_LEXER');

3,查询时候,使用:

select * from cmng_custominfo where contains (address, '金色新城')>1;

自己测试,发现select * from cmng_custominfo where contains (address, '%金色新城%')>1;才能实现模糊查询,并且使用了索引,数据库版本为oracle9.0.1.1.1

4,需要定期进行同步和优化:
同步:根据新增记录的文本内容更新全文搜索的索引。

begin
ctx_ddl.sync_index('INX_CUSTOMINFO_ADDR_DOCS');
end;

优化:根据被删除记录清除全文搜索索引中的垃圾

begin
ctx_ddl.optimize_index('INX_CUSTOMINFO_ADDR_DOCS', 'FAST');
end;

5,采用job做步骤4中的工作:

1)该功能需要利用oracle的JOB功能来完成
因为oracle9I默认不启用JOB功能,所以首先需要增加ORACLE数据库实例的JOB配置参数:
job_queue_processes=5
重新启动oracle数据库服务和listener服务。

2)同步 和 优化
--同步 sync:
variable jobno number;
BEGIN
DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.sync_index(''INX_CUSTOMINFO_ADDR_DOCS'');', SYSDATE, 'SYSDATE + (1/24/4)');
 commit;
END;

--优化
variable jobno number;
begin
 DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.optimize_index(''INX_CUSTOMINFO_ADDR_DOCS'',''FULL'');', SYSDATE, 'SYSDATE + 1');
 commit;
END;

其中, 第一个job的SYSDATE + (1/24/4)是指每隔15分钟同步一次,第二个job的SYSDATE + 1是每隔1天做一次全优化。具体的时间间隔,可以根据应用的需要而定

6,索引重建
重建索引会删除原来的索引,重新生成索引,需要较长的时间。
重建索引语法如下:
ALTER INDEX INX_CUSTOMINFO_ADDR_DOCS REBUILD;

据网上一些用家的体会,oracle重建索引的速度也是比较快的,有一用家这样描述:

Oracle 的全文检索建立和维护索引要比ms sql server都要快得多,笔者的65万记录的一个表建立索引只需要20分钟,同步一次只需要1分钟。
因此,也可以考虑用job的办法定期重建索引。

参考资料:
1,http://blog.csdn.net/yurenjia/archive/2007/04/08/1556306.aspx
2,http://topic.csdn.net/u/20080117/23/34004f4a-4989-47ef-8764-0b7e3bf737a7.html
3,http://tenwe.com/tech/database/oracle/200702/content_561_4.shtml
4,http://www.knowsky.com/389357.html
5,http://yangtingkun.itpub.net/post/468/195520
6,http://bbs.zdnet.com.cn/archiver/tid-120474.html
7,http://bbs.违规广告.com/archiver/tid-26270.html
8,http://oracle.**.com/exploiture/720104_3.html
9,http://www.33kuai.cn/html/shujuku/20080126/5314_2.html
10,http://www.xrss.cn/Dev/DataBase/20084218963.Html
分享到:
评论

相关推荐

    详解Oracle数据库中文全文索引.docx

    "Oracle数据库中文全文索引" Oracle数据库中文全文索引是Oracle数据库的一种功能强大的文本检索技术,通过使用Oracle Text,使Oracle9i具备了强大的文本检索能力和智能化的文本管理能力。Oracle Text是Oracle9i采用...

    oracle拼音首字母查询

    Oracle拼音首字母查询是一种在Oracle数据库中实现对汉字进行拼音首字母检索的技术。在中文环境中,为了方便用户根据汉字的拼音首字母进行快速查找,这种查询方式尤其有用。Oracle数据库虽然原生支持英文字符集,但...

    Delphi数据库模糊查询功能的改进

    2. **使用全文索引**:对于复杂的模糊查询,全文索引是一个更好的选择。它能够提供更高效的搜索,尤其是对于长文本字段。在支持全文索引的数据库系统(如SQL Server或MySQL)中,可以创建全文索引并利用全文搜索功能...

    ORACLE 全文检索实例.rar

    9. **监控和诊断**: Oracle提供工具和视图(如`V$CTXSTATS`、`DBA_TEXT_INDEXES`)来监控全文索引的性能和健康状况,及时发现并解决问题。 10. **安全和权限**: 确保正确配置权限,限制对敏感数据的访问。可以使用...

    Oracle数据库全文检索性能研究.pdf

    测试结果详细分析了全文检索的查全率(即找到相关信息的能力)和查询速度,为实际应用提供了参考。 全文检索性能的研究对于数据库管理员和开发者来说具有重要意义,它能帮助优化查询策略,提高系统性能,特别是在...

    oracle全文检索.pdf

    ### Oracle全文检索技术详解 #### 一、Oracle Text 概述 Oracle Text 是 Oracle 数据库的一项强大特性,它使得 Oracle9i 及后续版本具备了先进的文本检索与智能化管理功能。这一特性最早在 Oracle8 之前的版本中被...

    基于Oracle的全文检索系统设计与实现.pdf

    在实际应用中,例如,对Word文档集合的全文检索,可以先将Word文件的路径存储在数据库中,然后使用Oracle Text的全文索引功能对这些文件进行索引。当用户发起搜索请求时,系统会通过索引查询数据库,返回匹配的文档...

    oracle全文检索

    在实际使用中,Oracle全文检索支持多种查询语法,包括简单的关键词查询、布尔运算符(AND、OR、NOT)、短语查询(使用引号括起来的词组)以及模糊匹配(通过通配符*和?实现)。此外,还可以使用RANK函数来根据相关性...

    基于Oracle大数据的全文检索技术研究与实现.pdf

    Oracle Text提供了多种索引类型,可以根据实际需求选择合适的索引策略,以提高索引效率和检索速度。 3. **权限控制**:由于不同的中间件可能有不同的用户管理和权限控制机制,文章中提出的方案通过集成处理,解决了...

    Oracle 全文检索应用

    3. **创建索引**:使用Oracle Text提供的工具或PL/SQL程序包创建全文索引。这通常涉及到定义索引首选项,如语言设置、停用词等。 4. **查询和管理**:一旦索引建立,就可以通过标准SQL查询语句来执行全文检索。此外...

    oralce优化教程汇总

    通过综合分析V$视图,可以诊断并解决Oracle数据库中的性能问题,如锁争用、I/O瓶颈、内存不足等。 总结来说,Oracle优化涉及SQL优化、索引策略和性能监控等多个方面。理解并掌握这些技术,可以有效地提升Oracle...

    Oracle Text教程.ppt

    首先,Oracle Text 从 Oracle 7 版本开始引入,起初称为 Oracle ConText Cartridge,在 Oracle 8/8i 时期演变为 Oracle interMedia,直至 Oracle 9i 正式被命名为 Oracle Text。Oracle Text 支持多种语言,包括但不...

    oracle like 的优化

    在Oracle数据库中,LIKE操作符是用于模糊查询的关键字之一。它允许用户通过模式匹配的方式检索数据,从而增加了查询的灵活性。然而,这种灵活性也带来了性能上的挑战,尤其是在处理大规模数据集时。因此,了解如何...

    JAVA日记

    传统上,当数据库中的文本字段采用LIKE操作进行模糊匹配时,由于无法利用索引加速查询过程,系统的响应速度和资源消耗会显著增加,特别是在处理大量文本数据时,这种效率问题尤为突出。因此,全文索引技术应运而生,...

    coreseek-3.2.14.zip

    - SQL全字段全文索引:CoreSeek能够直接从MySQL等数据库中抽取数据进行索引,简化了数据同步过程。 - 更丰富的查询语法:CoreSeek扩展了Sphinx的查询语法,例如支持SQL-like查询,使得开发者更容易上手。 3. ...

    Oracle Knowledge Management Implementation Guide Release 11i

    Oracle Knowledge Management Implementation Guide Release 11i 是一份官方文档,主要针对Oracle企业级应用套件11i(E-Business Suite 11i)中的知识管理模块提供了详细的实施指南。Oracle E-Business Suite 11i 是...

    Java面试问题总结

    SQL调优步骤包括分析慢查询日志、调整语句结构、使用EXPLAIN分析执行计划和根据情况优化索引。 MySQL支持多种存储引擎,如ISAM、MyISAM、InnoDB、Memory、NDBCluster、ARCHIVE、CSV等,其中InnoDB是最常用的一种,...

    一些Oracle数据库中的查询优化建议综合

    如果需要模糊匹配,考虑使用全文索引或正则表达式,但效率可能较低。 7. **避免在`WHERE`子句中使用参数**:动态SQL可能导致全表扫描,因为优化器无法预知参数值。可以使用`WITH(INDEX)`来强制使用特定索引。 8. *...

Global site tag (gtag.js) - Google Analytics