- 浏览: 51564 次
- 性别:
- 来自: 北京
最新评论
众所周知,使用 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
为这个事情脑袋疼了无数次。最近,一客户“无理”要求对用户地址模糊查询速度太慢。在数十万的用户记录下查询,要求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的left join中on和where的区别
2012-10-26 15:43 960Oracle的left join中on和where的区别 数 ... -
动态sql拼接单引号与 变量赋值
2012-06-21 10:09 3827if (lower(s_table)='gl_deta ... -
ora-00031:session marked for kill处理oracle中杀不掉的锁
2012-06-19 16:36 1042转: 一些ORACLE中的进程被杀掉后,状态被置为" ... -
使用DBLINK为远程数据库的用户表创建同义词
2012-06-19 14:39 9121、创建db_link create database l ... -
以字符串数组为输入参数的存储过程
2012-06-19 14:27 2725今天项目中需要用到存 ... -
函数的使用
2012-06-04 17:09 967create or replace function Fun_ ... -
Oracle中decode的使简单例子
2012-06-04 17:06 1462decode(字段,表达式1,表达式2,表达式。。。) 当,字 ... -
oracle触发器
2012-04-20 09:11 722表: A 字段:a, b, c 当修改a字段的值时触发 c字段 ... -
oracle的全文索引
2012-04-16 14:29 781已有几个项目组开始使 ... -
单独的plsql链接数据库
2011-10-14 16:03 895转的: plsql 可不可以 ... -
Oracle经验集锦
2011-09-24 13:32 6801.删除表空间 DROP ... -
两个数据库字符集不一样,如何快速增量同步数据.
2011-09-23 15:00 1137环境: DB-A 字符集:US7ASC ... -
Oracle分区表详解 .
2011-08-06 10:42 636一、Oracle分区简介 ORACLE的分区是一种处理超大型 ... -
利用 rowid 提升update性能 .
2011-08-04 23:52 1798能不能想办法 提升一下如下update语句的性能 UPDA ... -
oracle全文索引的简单配置
2011-08-04 23:49 9951.创建数据存储定义(Datastore),使用多列数据存储在 ... -
用java调用oracle存储过程总结
2011-08-04 23:45 6361、什么是存储过程。存 ... -
Oracle SCN详解
2011-08-04 23:38 600pre. Oracle中的SCN(system change ... -
oracle 数据库里查看表空间使用状况
2011-08-04 23:34 636oracle表空间的事情状况要经常查看,一般空闲比例过低的时候 ... -
oracle9i在windows上的dataguard配置
2011-08-04 23:23 701主库:win2003 server ora9i(9.2.0.1 ... -
Rman duplicate数据库复制(单系统)
2011-08-04 23:22 643一、实验环境: 1. 虚拟机:VMware Ser ...
相关推荐
CoreSeek是一款专为中文环境设计的全文搜索引擎技术,它主要作为MySQL数据库的扩展,提供了高效、精准的全文索引解决方案。在MySQL的基础上,CoreSeek融入了Sphinx全文索引引擎,使得对中文文本的检索性能得到了显著...
本篇文章将围绕如何解决MySQL中的中文模糊搜索不精确问题展开讨论,并提供一些实用的解决方案。 ### 一、理解MySQL模糊搜索 在MySQL中,模糊搜索通常通过`LIKE`操作符来实现。例如,以下SQL语句用于查找标题中包含...
2. **高效性**:Sphinx采用了倒排索引技术,大幅度提高了搜索速度。倒排索引是一种以词为单位组织的索引结构,可以快速定位到包含特定词汇的文档。 3. **扩展性**:Sphinx支持分布式搜索,可以通过集群部署来扩展...
传统上,当数据库中的文本字段采用LIKE操作进行模糊匹配时,由于无法利用索引加速查询过程,系统的响应速度和资源消耗会显著增加,特别是在处理大量文本数据时,这种效率问题尤为突出。因此,全文索引技术应运而生,...
2. **使用全文索引**:对于商品名称的模糊匹配查询,可以使用全文索引提高搜索速度。 3. **分页优化**:对于分页查询,优化LIMIT子句的使用方式,避免全表扫描。 4. **缓存策略**:对热门查询结果进行缓存,减少对...
然而,对于像LIKE"%word%"这样的模糊查询,传统的数据库索引效率低下,因为它们未针对全文索引进行优化。相比之下,Lucene通过建立反向索引机制解决了这个问题。反向索引将数据源中的每篇文章与关键词映射起来,存储...
3. **全文搜索**: 对于复杂的模糊查询需求,可以考虑使用SQLite的FTS(Full-Text Search)模块,它可以实现高效的全文索引和搜索。 四、汉字转拼音 1. **API转换**: Android API提供`PinyinHelper`类,用于将汉字...
Libsys5.5引入了高效的全文检索和元数据检索功能,通过索引优化和模糊匹配技术,提高检索速度和准确度,使用户能快速找到所需信息。 3. 数据分析:在大数据时代,图书馆需对用户行为、借阅趋势等进行深度分析,以...
为了提供高效的服务,可以采用全文检索技术,如倒排索引,提高查询速度。同时,系统可能还提供了排序和过滤功能,帮助用户快速找到所需图书。 在项目实施过程中,总结报告书记录了整个开发流程,包括需求分析、系统...
全文索引主要解决文本数据的模糊匹配查询问题;哈希索引适用于等值查询,尤其对于主键等值查询效率很高,但在范围查询和排序时效率较低;B树索引是Mysql默认使用的索引类型,它的数据结构适合磁盘存储,可以减少磁盘...
1. 索引速度慢:检查硬件配置,优化数据读取和写入,或者调整索引线程数。 2. 查询性能下降:分析查询语句,优化查询条件,避免全表扫描。 3. 内存溢出:调整内存分配,优化数据结构,减少不必要的内存占用。 总之...
通过合理地分段,可以平衡索引大小、查询速度和资源消耗。 "教你使用solr搭建你的全文检索.mht"文件是一个教程,指导用户如何从零开始搭建Solr全文检索系统。全 文检索是Solr的主要功能,包括字段匹配、模糊搜索、...
- 为了优化搜索速度,可以采用分词技术将短信内容分解成关键字列表,并建立倒排索引。 #### 安卓平台下的实现 本方案基于Android平台进行开发,该平台因其开放性和丰富的API资源而受到开发者青睐。在Android平台...
- 解决方法是使用分词、创建索引,建立全文索引。如例子所示,将文档内容分词,建立索引表,以加速查询。 7. **数据处理策略**: - 对于大量数据,可以采用异步处理,将任务放入队列,避免一次性处理导致系统压力...
3. **全文索引**:为了加速搜索,search-match可能构建了全文索引,将原始文本数据转换为一种更适合快速查询的数据结构,如倒排索引。倒排索引可以极大地提高大规模数据集的搜索速度。 4. **并行与分布式搜索**:...
1. **关系数据库中的模糊查询**:当在关系型数据库中执行模糊查询时,传统索引可能失效,全文检索可以帮助提升查询性能。 2. **搜索引擎**:如百度、Google等搜索引擎背后的核心技术就是全文检索。 3. **垂直...
它采用全文索引技术,预先对文件内容建立索引,使得在需要时能够迅速定位含有目标关键词的文件。全文索引包括分词、索引构建和查询优化等步骤,确保了搜索速度和准确性。 其次,这款神器的一大特点是其易用性。用户...
本文提出的“分布式搜索引擎中关键词倒排索引方法”旨在解决传统信息检索方法中存在的检索效率低、安全性差和准确性不足的问题。关键词倒排索引是一种常用的全文搜索引擎技术,它能快速定位到包含特定关键词的文档。...