- 浏览: 132094 次
- 性别:
- 来自: 重庆
文章分类
最新评论
-
酱油男js:
不错...学习了。
oracle sql 优化大全 -
浪子秋水:
网页编码就是那点事 -
shenghuorulan:
通俗易懂。好文章,直接想到的问题都提到了。
oracle 全文检索实践 -
飞儿9530:
lucene 3.0.1 学习
前段时间,项目中需要有一个实时检索数据的方案,并说明不是用数据库模糊查询关键字like,而是像baidu那样的搜索效果,做到最大匹配。并提示我看一下lucene。
我自己去的熟悉了下lucene,然后写了个demo,但他们说为了一个简单的查询检索,确引入了一个lucene,有点不划算。所以让我找其他的解决办法。
我找呀找,居然找到了select * from T where contains(F,'test',1)>0,这种oracle全文检索的方式,以前没见过的,貌似能解决我的问题。所以我就学习了一下oracle的全文检索。
在这里我记录了一下我的学习笔记,如果各位想要了解更全面的全文检索要点,请看这篇博客,讲的很详细,我认为非常非常的好。
http://yangtingkun.itpub.net/post/468/246823
1.oracle text
首先这里说oracle 全文检索,是针对我机器上的oracle 10g版本的。至少 10g 或以上的版本 适合这样来使用。
oracle 的全文检索,操作步骤为:将表中需要检索的字段,创建为全文检索的索引,然后通过select * from T where contains(F,'test',1)>0的语句进行全文检索,达到预期效果。
然后,oracle全文检索还是很强大的,能够检索文本啊、还有其他多种格式的文档。我做的测试只是针对数据库中的某一个字段的检索。比如针对地址表中的地址进行检索。
2.准备操作
首先,先建一个表用于测试,在名为testuser用户下建表。
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,'成都市天府软件园');
oracle全文检索需要ctxsys用户的支持,其实主要是需要使用ctxsys用户下的ctx_ddl这个包,这个包中绝大部分过程的创建都与全文检索有关。
首先需要对ctxsys用户解锁,以获得ctx_ddl包的操作权。
进入system用户,输入如下命令,解锁ctxsys用户
alter user ctxsys account unlock;
然后将ctx_ddl包的操作权限赋给testuser用户。
也是在system用户下,输入如下命令,赋予目标用户ctx_ddl包操作权限
grant execute on ctx_ddl to testuser;
至此,准备工作已经完成了
3.创建分析器
oracle text的分析器,类似于lucene中的分词器,将需要检索的记录,按照一定的方式进行词组拆分,然后存放在索引表中。检索的时候根据索引表中存放的拆分词组,对传入的关键字进行匹配,并返回匹配结果。
oracle text中的分析器有3种:
- basic_lexer:只能根据空格和标点来进行拆分。比如“中国重庆”,只能拆分为“中国重庆”一个词组
- chinese_vgram_lexer:专门的汉语分析器,按字单元进行拆分,比如“中国重庆”,可以拆分为“中”、“中国“、”国重”、“重庆”、“庆”五个词组。这种方式的好处是能够将所有有可能的词组全部保存进索引表,使得数据不会遗漏。
- chinese_lexer:一种新的汉语分析器,能够认识大部分常用的汉语词汇,并按常用词汇进行拆分存储。比如“中国重庆”,只会被拆分为“中国”、“重庆”两个词组。
这里我使用chinese_lexer这个分词器,用testuser用户登录,执行下面的命令,创建分析器。
exec ctx_ddl.create_preference ('my_lexer', 'chinese_lexer');
这句话的意思是,创建一个“chinese_lexer”分析器,名称为my_lexer。
4.创建过滤词组
在我们建索引的时候,通常需要对一些常用的词组进行过滤,比如对公司名称进行检索时,肯定不希望输入“有限公司”、“公司”等关键词时,也会有搜索结果。
用testuser用户登录,执行下面的命令,创建过滤词组
exec ctx_ddl.create_stoplist('my_stoplist');
创建过滤词组成功以后,需要自定义需要过滤的词组
ctx_ddl.add_stopword('my_stoplist','有限公司'); ctx_ddl.add_stopword('my_stoplist','股份有限公司');
意思就是,创建了一个名为“my_stoplist”的过滤词组,“有限公司”、“股份有限公司”这两个词组不会被创建为索引
5.创建索引
其实前面的工作,都是为创建索引做准备的。
我要对YU_TEST表中的name字段进行检索,首先必须对name字段创建索引。
这里需要注意的是,name字段不能为nvarchar2类型,并且这个表的主键也不能为nvarchar2型,否则无法创建索引。
create index YU_TEST_INDEX on YU_TEST(name) indextype is CTXSYS.CONTEXT parameters('lexer my_lexer stoplist my_stoplist');
这句话的意思就是,在YU_TEST_INDEX表中的name字段上创建索引,索引类系那个为context类型,该索引用到的分析器为前面定义的my_lexer,该索引用到的过滤词组为前面定义得my_stoplist。
索引创建成功后,你回发现,在当前用户的表中,多了四个表
其中YU_TEST表中name字段被拆分后的词组保存在DR$YU_TEST_INDEX$I表中
这样可以看见索引的详细信息。
6.使用索引
select * from YU_TEST where contains(name,'重庆')>0;
select score(1),y.* from YU_TEST y where contains(name,'重庆',1)>0 order by score(1) desc;
exec ctx_ddl.sync_index('yu_test_index')
exec ctx_ddl.optimize_index('yu_test_index','full')
exec CTX_DDL.CREATE_POLICY('MY_POLICY', LEXER => 'my_lexer');
create or replace function p_split_chinese(p_input in varchar2) return varchar2 as v_tab CTX_DOC.TOKEN_TAB; v_return VARCHAR2(323767); begin CTX_DOC.POLICY_TOKENS('my_policy',p_input,v_tab); for i in 1..v_tab.count loop v_return := v_return || ',' || v_tab[i].token; end loop; return LTRIM(v_return,','); end; /
可以看到这里显示的只有“天府”相关的信息,那么“重庆”相关的呢?
发表评论
-
oracle查看执行计划
2014-05-05 12:35 1252基于ORACLE的应用系统很多性能问题,是由应用系统SQ ... -
oracle执行计划
2014-05-03 16:26 1287来自: http://czmmiao.iteye.com/ ... -
Oracle中B-TREE索引的深入理解
2014-05-03 16:25 1178来自 http://czmmiao.diandia ... -
如何写出高性能SQL语句
2014-05-01 20:32 952优化SQL查询:如何写出 ... -
Oracle索引总结
2014-05-01 20:30 1051索引简介 1、索引是数据库对象之一,用于加快数据的检索,类 ... -
ORA-01843: not a valid month解决办法
2014-04-26 16:01 7782如下的语句: select to_date('2003,Ma ... -
ORA-01950:no privileges on tablespace 'USERS'
2014-04-26 15:21 1030创建用户myuserSQL>create user my ... -
awr报告详细解析
2014-04-14 22:53 4088WORKLOAD REPOSITORY report f ... -
oracle sql 优化大全
2014-04-10 22:37 1436转自: http://panshaobinsb.itey ... -
oracle表分区
2014-04-10 09:06 690转自 http://love-flying-snow.it ... -
数据库设计:表的设计命名的十个注意点
2014-04-09 23:30 13881.表名一般以【模块 ... -
Oracle B-tree、位图、全文索引三大索引性能比较及优缺点汇总
2014-04-09 22:47 1062转自 http://www.itpub.net/thre ... -
Oracle中的索引详解
2014-04-05 11:08 621来自:http://www.oschina.net/que ... -
物化视图基本语法
2014-02-12 10:38 1173http://blog.sina.com.cn/s/blog_ ... -
oracle 全文检索实践
2011-11-19 17:05 1880来源: http://yangting ...
相关推荐
《Oracle NoSQL数据库:实时大数据管理》讲述如何全面运用Oracle NoSQL数据库这个经济实惠的解决方案来存储、检索和更新海量的非结构化数据。本书在紧贴实用的示例的引导下,介绍Oracle NoSQL数据库的安装、配置、...
Oracle 数据访问安全最佳实践 Oracle 在不同的场景下选择最合适的性能诊断工具 Oracle高级压缩——企业数据生命周期管理最佳实践 Oracle上云之舍和得 Oracle升级到19C前关于性能需要关注哪些点? Oracle ...
本书的每一章都提供吸引人的练习题、实践问题和本章知识点回顾以强化所学的知识。本书既是帮助读者轻松地通过oca/ocp认证考试的好帮手,也是oracle从业人员必备的参考书。 本书全面覆盖了1z0-051、1z0-052和1z0-...
2.2.3.7 实践的体会 49 2.3 体系学习让SQL性能提升千倍 65 2.3.1 一起探索体系学习的意义 65 2.3.1.1 同学们不知所学何用 66 2.3.1.2 实际上大有用武之地 67 2.3.2 单车到飞船的经典之旅 70 2.3.2.1 未优化前,单车...
个人博客管理系统(Spring4+Springmvc4+MyBatis3+Bootstrap+EasyUI+oracle) 使用Maven3+Spring4+Springmvc+Mybatis3架构
本书的每一章都提供吸引人的练习题、实践问题和本章知识点回顾以强化所学的知识。本书既是帮助读者轻松地通过oca/ocp认证考试的好帮手,也是oracle从业人员必备的参考书。 本书全面覆盖了1z0-051、1z0-052和1z0-...
本书将讲授读者需要了解的SQL知识,我们从简单的数据检索入手,然后再介绍一些较为复杂的内容,如联结、子查询、存储过程、游标、触发器以及表约束等。读者将从本书中循序渐进、系统、直接地学到SQL的知识和技巧。 ...
后端开发主要涉及服务器、数据库和应用程序之间的交互,确保数据的存储、检索和处理得以顺利进行。以下是一些关于后端开发的教程和案例,帮助你更好地理解和实践后端开发。 教程 1.基础语言与框架学习: 1.Python:...
1、一站式向量检索平台0.2.pdf 2、数据驱动实时精细化运营实践.pdf 3、打造弹性云应用:多云多Kubernetes集群流量方案,pdf 4、vivo大模型计算集群建设实践.pdf 5、Oracle OCI生成式AI解决方案2.0.pdf 6、Alluxio AI:...
建立在OS的基础之上,位于OS与用户之间的数据管理软件,负责对数据库进行统一管理和控制 如: ACCESS,SQL SERVER, ORACLE,…… DB DBMS ACCESS2010数据库基础教程-01第一章数据库系统概述全文共24页,当前为第11...
轻举技术之“纲”,张合用之“目”,锻造SQL高可用性数据库应用指南从理论到实践,凝聚SQL主流数据库最前沿的技术要领,本书将深入浅出讨论。 本书特色:主要介绍SQL的语法规则及在实际开发中的应用,并且对SQL在...
第1章 Oracle服务器技术与关系范例 ...12.7.2 实践题 12.7.3 自测题答案 12.7.4 实验题答案 附录A本书提供的OCA考试资料 本书配套模拟试题 系统要求 MasterExam 卸载MasterExam 技术支持 LearnKey技术支持 术语表
oracle 的讨论 PHP7.0.3 - 关于如何安装 php 扩展的讨论 Awesome-PHP 收集整理一些常用PHP类库, 资源以及技巧. 以便在工作中Swift的查找所需... PHP网站(PHP Websites) - 一个PHP实践的快速参考指导 - 一个PHP最佳...
作为互联网战略的延伸,电子商务的热潮一度兴起,但是一直以来,很多企业网站都局限在信息发布等一些基本的功能,而越来越深入的实践表明,这些仅仅代表了企业网站的一个起点功能。随着企业网络环境的发展成熟,企业...
1.3 动手实践..... 6 1.4 小结..... 7 第2章 检索数据...... 8 2.1 SELECT语句..... 8 2.2 检索单个列..... 9 2.3 检索多个列..... 10 2.4 检索所有列..... 11 2.5 小结..... 12 第3章 排序检索数据...... 13 3.1 ...
可按任意字段排序的分页存储过程(不用临时表的方法,不看全文会后悔) 常用sql存储过程集锦 存储过程中实现类似split功能(charindex) 通过查询系统表得到纵向的表结构 将数据库表中的数据生成Insert脚本的存储过程!!! ...
掌握本专业所要求的基础知识、专业技能并具有较 强的自学和实践能力;了解本专业的发展趋势,具有良好的专业素质和创新意识,具有求 实开拓精神,有迎接挑战和抓住机遇的能力;具有一定的社会活动能力、组织能力和...