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

采用全文索引解决模糊查询速度慢的问题

 
阅读更多
众所周知,使用 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


分享到:
评论

相关推荐

    coreseek中文全文索引解决方案

    CoreSeek是一款专为中文环境设计的全文搜索引擎技术,它主要作为MySQL数据库的扩展,提供了高效、精准的全文索引解决方案。在MySQL的基础上,CoreSeek融入了Sphinx全文索引引擎,使得对中文文本的检索性能得到了显著...

    mysql 中文 模糊搜索 不精确 解决办法

    本篇文章将围绕如何解决MySQL中的中文模糊搜索不精确问题展开讨论,并提供一些实用的解决方案。 ### 一、理解MySQL模糊搜索 在MySQL中,模糊搜索通常通过`LIKE`操作符来实现。例如,以下SQL语句用于查找标题中包含...

    中文搜索解决方案之sphinx

    2. **高效性**:Sphinx采用了倒排索引技术,大幅度提高了搜索速度。倒排索引是一种以词为单位组织的索引结构,可以快速定位到包含特定词汇的文档。 3. **扩展性**:Sphinx支持分布式搜索,可以通过集群部署来扩展...

    JAVA日记

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

    高性能MySQL_ch04_查询性能优化.pdf

    2. **使用全文索引**:对于商品名称的模糊匹配查询,可以使用全文索引提高搜索速度。 3. **分页优化**:对于分页查询,优化LIMIT子句的使用方式,避免全表扫描。 4. **缓存策略**:对热门查询结果进行缓存,减少对...

    Lucene搜索技术

    然而,对于像LIKE"%word%"这样的模糊查询,传统的数据库索引效率低下,因为它们未针对全文索引进行优化。相比之下,Lucene通过建立反向索引机制解决了这个问题。反向索引将数据源中的每篇文章与关键词映射起来,存储...

    anndroid搜索功能通讯录字母匹配

    3. **全文搜索**: 对于复杂的模糊查询需求,可以考虑使用SQLite的FTS(Full-Text Search)模块,它可以实现高效的全文索引和搜索。 四、汉字转拼音 1. **API转换**: Android API提供`PinyinHelper`类,用于将汉字...

    巧用汇文文献信息系统Libsys5.5解决几个大数据问题.zip

    Libsys5.5引入了高效的全文检索和元数据检索功能,通过索引优化和模糊匹配技术,提高检索速度和准确度,使用户能快速找到所需信息。 3. 数据分析:在大数据时代,图书馆需对用户行为、借阅趋势等进行深度分析,以...

    UI设计+易语言+图书管理和查询系统+总结报告书

    为了提供高效的服务,可以采用全文检索技术,如倒排索引,提高查询速度。同时,系统可能还提供了排序和过滤功能,帮助用户快速找到所需图书。 在项目实施过程中,总结报告书记录了整个开发流程,包括需求分析、系统...

    2021年数据库秋招面试题常考_数据库考试选择题

    全文索引主要解决文本数据的模糊匹配查询问题;哈希索引适用于等值查询,尤其对于主键等值查询效率很高,但在范围查询和排序时效率较低;B树索引是Mysql默认使用的索引类型,它的数据结构适合磁盘存储,可以减少磁盘...

    Hubble.net使用手册

    1. 索引速度慢:检查硬件配置,优化数据读取和写入,或者调整索引线程数。 2. 查询性能下降:分析查询语句,优化查询条件,避免全表扫描。 3. 内存溢出:调整内存分配,优化数据结构,减少不必要的内存占用。 总之...

    solr资料以及问题汇总

    通过合理地分段,可以平衡索引大小、查询速度和资源消耗。 "教你使用solr搭建你的全文检索.mht"文件是一个教程,指导用户如何从零开始搭建Solr全文检索系统。全 文检索是Solr的主要功能,包括字段匹配、模糊搜索、...

    基于Android的高效短信查询软件的实现

    - 为了优化搜索速度,可以采用分词技术将短信内容分解成关键字列表,并建立倒排索引。 #### 安卓平台下的实现 本方案基于Android平台进行开发,该平台因其开放性和丰富的API资源而受到开发者青睐。在Android平台...

    jt13日常笔记

    - 解决方法是使用分词、创建索引,建立全文索引。如例子所示,将文档内容分词,建立索引表,以加速查询。 7. **数据处理策略**: - 对于大量数据,可以采用异步处理,将任务放入队列,避免一次性处理导致系统压力...

    search-match安装包

    3. **全文索引**:为了加速搜索,search-match可能构建了全文索引,将原始文本数据转换为一种更适合快速查询的数据结构,如倒排索引。倒排索引可以极大地提高大规模数据集的搜索速度。 4. **并行与分布式搜索**:...

    搜索引擎Lucene简单入门.pdf

    1. **关系数据库中的模糊查询**:当在关系型数据库中执行模糊查询时,传统索引可能失效,全文检索可以帮助提升查询性能。 2. **搜索引擎**:如百度、Google等搜索引擎背后的核心技术就是全文检索。 3. **垂直...

    文本搜索神器!

    它采用全文索引技术,预先对文件内容建立索引,使得在需要时能够迅速定位含有目标关键词的文件。全文索引包括分词、索引构建和查询优化等步骤,确保了搜索速度和准确性。 其次,这款神器的一大特点是其易用性。用户...

    分布式搜索引擎中关键词倒排索引方法仿真.pdf

    本文提出的“分布式搜索引擎中关键词倒排索引方法”旨在解决传统信息检索方法中存在的检索效率低、安全性差和准确性不足的问题。关键词倒排索引是一种常用的全文搜索引擎技术,它能快速定位到包含特定关键词的文档。...

Global site tag (gtag.js) - Google Analytics