oracle全文检索【转】【补】
全文检索
oracle对使用几十万以上的数据进行like模糊查询速度极差,包括 like 'AAA%' ,like '%AAA',like '%AAA%',like '%A%A%'的那些模糊查询。网上有很多文章讲到如何提高like查询,提到 like 'AAA%'能够使用到索引,而like '%AAA' ,使用创建反向函数的索引来提高查询效率。
为了解决大数据情况下的模糊查询速度慢的问题,oracle创建了全文检索技术.
即通过Oracle专利的词法分析器(lexer),将文章中所有的表意单元(Oracle称为term)找出来,记录在一组以dr$开头的表中,同时记下该term出现的位置、次数、hash值等信息。检索时,Oracle从这组表中查找相应的term,并计算其出现频率,根据某个算法来计算每个文档的得分(score),即所谓的‘匹配率’。而lexer则是该机制的核心,它决定了全文检索的效率。
oracle有三个基本的分词器
-- basic_lexer 针对英文,因为英文都用空格和标点分词,纯英文时建议用它
-- chinese_vgram_lexer 针对中文,支持所有汉字字符集,以字词为单元,分词较机械
-- chinese_lexer 针对中文,只支持utf8字符集,只认高频常用字词,效率更高,中文时建议用它.
数数据量达到百万级别以上时,在单列上建立的全文索引相比普通索引的查询速度那将是天差地别的.
准备工作
在使用前如果以下语句不能正常执行,那定是DBA没有给该User赋权限.
1检查和设置数据库角色
首先检查数据库中是否有CTXSYS用户和CTXAPP脚色。如果没有这个用户和角色,意味着你的数据库创建时未安装intermedia功能。你必须修改数据库以安装这项功能。默认安装情况下,ctxsys用户是被锁定的,因此要先启用ctxsys的用户。
ctxsys用户默认是被锁定的且密码即时失效,所以我们以sys用户进入em,然后修改ctxsys用户的状态和密码。
2赋权
以abc用户下的tbl_my_lex表为例.
先以sys用户DBA身份登录,对abc赋resource,connect权限:
GRANT resource, connect to abc;

再以ctxsys用户登录并对abc用户赋权
GRANT ctxapp to abc; GRANT execute ON ctxsys. ctx_cls TO abc; GRANT execute ON ctxsys. ctx_ddl TO abc; GRANT execute ON ctxsys. ctx_doc TO abc; GRANT execute ON ctxsys. ctx_output TO abc; GRANT execute ON ctxsys. ctx_query TO abc; GRANT execute ON ctxsys. ctx_report TO abc; GRANT execute ON ctxsys. ctx_thes TO abc; GRANT execute ON ctxsys. ctx_ulexer TO abc;

基本语法
然后以abc用户登录 :
conn abc/abc;
--------------------------------------------------------------------------------------
-- 建表 Create table tbl_my_lex (id number primary key, info varchar2(1000)); Insert into tbl_my_lex values (1, 'this is a example for the basic_lexer'); Insert into tbl_my_lex values (2, 'he following example sets Printjoin characters '); Insert into tbl_my_lex values (3, 'To create the INDEX with no_theme indexing '); Insert into tbl_my_lex values (4, '中华人民共和国'); Insert into tbl_my_lex values (5, '中国淘宝软件'); Insert into tbl_my_lex values (6, '测试basic_lexer 是否支持中文'); Commit;
--------------------------------------------------------------------------------------
-- 创建一个名为my_chinese_lexer的chinese_lexer格式的分词器
Begin
ctx_ddl.create_preference('my_chinese_lexer', 'chinese_lexer');
End;
/
--------------------------------------------------------------------------------------
-- 对tbl_my_lex这张表的info列的信息建立一个名为IDX_TBL_COL的索引
Create index IDX_TBL_COL on tbl_my_lex (info) indextype is ctxsys.context parameters ('lexer my_chinese_lexer');
--------------------------------------------------------------------------------------
-- 以刚才建立的全文索引方式进行查询 Select * from tbl_my_lex where contains(info, '中国') > 0;

--------------------------------------------------------------------------------------
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑如果表是死的不会增删,那么到此为止就够了↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓如果表是活的,会动态增加,那么继续往下看↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
-- 存过1,同步索引,即把新增的记录,添加到索引的检索范围
begin
ctx_ddl.sync_index('IDX_TBL_COL');
end;
/
-- 意为如果新增一行记录,不用ctx_ddl .sync_index,
-- 直接 Select * from tbl_my_lex where contains(info, '中国') > 0;查到的结果是不会改变的
--------------------------------------------------------------------------------------
-- 存过2,同步索引,即把删除的记录,踢出索引的检索范围
begin
ctx_ddl.optimize_index('INX_CUSTOMINFO_ADDR_DOCS', 'FAST');
end;
/
-- 意为如果删除一行记录,不用ctx_ddl .sync_index,
-- 直接 Select * from tbl_my_lex where contains(info, '中国') > 0;查到的结果是不会改变的
--------------------------------------------------------------------------------------
-- 网上文章说: 65万记录的一个表建立索引只需要20分钟,同步一次约1分钟 -- 所以对存过1和存过2作job定时是很有必要的.
-- 其它语句
--------------------------------------------------------------------------------------
-- 删除一个名为my_chinese_lexer的chinese_lexer格式的分词器
Begin
ctx_ddl.drop_preference('my_chinese_lexer');
End;
/
--------------------------------------------------------------------------------------
DROP INDEX IDX_TBL_COL FORCE; -- 强行删除索引
--------------------------------------------------------------------------------------
参考
http://chaoji-liangbin.blog.163.com/blog/static/252392122010915101351354/
http://blog.chinaunix.net/uid-14107-id-2844042.html
http://blog.itpub.net/15962/viewspace-1005675/
oracle全文检索【转】【补】的更多相关文章
- oracle 全文检索
一.使用 sys 用户登录oracle (1)运行—cmd—sqlplus — sys/密码 @连接字符 as sysdba 二.授权 1.grant ctxapp to 全文检索使用用户: 2.gr ...
- 找到一篇关于 Oracle 全文检索实践 的文章
http://www.iteye.com/topic/1118055 有详细的例子记录了Oracle 全文检索的使用.
- oracle 全文检索创建脚本示例
--创建全文索引 grant execute on ctx_ddl to username;--使用其他帐号对username授权exec ctx_ddl.create_preference('my_ ...
- oracle全文检索
全文检索 oracle对使用几十万以上的数据进行like模糊查询速度极差,包括 like 'AAA%' ,like '%AAA',like '%AAA%',like '%A%A%'的那些模糊查询.网上 ...
- ORACLE SQL前端补0的三种方式。
前端补0的三种方式. select lpad(sal,8,'0') from emp;select to_char(sal,'00000000') from emp;select substr('00 ...
- oracle 全文检索技术
1.查看用户: select * from dba_users WHERE username='CTXSYS';select * from dba_users WHERE username='CTXS ...
- 转 Oracle全文检索http://docs.oracle.com/cd/E11882_01/text.112/e24436/toc.htm
SQL > exec ctx_ddl.create_preference ('my_test_lexer','chinese_lexer') : PL/SQL 过程成功完成 SQL > E ...
- Oracle 给字符串补空格、补0
利用lpad().RPAD()函数来实现给字符串补空格或补0的功能: 一.lpad()lpad函数将左边的字符串填充一些特定的字符其语法格式如下:lpad(string,n,[pad_string]) ...
- oracle不足位数补零的实现sql语句
select rpad('AAA',5,'0') from dual; 这样就可以了 [注意] 1.'AAA'为待补字符:5表示补齐后的总字符长度:0表示不足时补什么字符 2.rpad是右侧补0,左侧 ...
随机推荐
- Oracle备份恢复简单过程以及中间的坑.
Oracle 冷备: 貌似需要dbca创建一致的oracle instance 服务器配置版本尽量相同,安装路径相同. 关闭Oracle服务 将oracle app 目录下的oradata以及有快速闪 ...
- [读书笔记]Linux命令行与shell编程读书笔记01
1. Linux的组成部分 1)linux内核(kernel) 2)GNU工具链 3)GUI/CLI工作几面(shell) 4)应用程序(app) 2Linux内核的主要工作: 1) 管理内存 2)管 ...
- [书摘]图解HTTP 状态码
状态码类别: 1XX informational 信息性状态码 2XX Suess 成功状态码 3XX Redirection 重定向状态码 4XX Client error 客户端错误状态码 5 ...
- loadrunner 基础-学习笔记一
由于公司要使用loadrunner暂停学习jmeter 1 loadrunner组件: virtual user generator:录制最终用户业务流程并创建自动化性能测试脚本,vuser脚本 co ...
- xhtml 意義
xhtml是html和xml的結合體. xhtml包含所有xml和html4.0結合的部分. xml是描述語言,html是顯示語言.二者結合可以產生形式良好的文檔. 不僅可以適用與電腦瀏覽器,也可以適 ...
- spring cloud实战与思考(一) spring config全局配置方案设计
“spring cloud”的配置中心工具“spring cloud config”提供了分布式系统配置文件集中管理解决方案.该工具功能强大,实现也很简单.网上可以搜索到很多开发教程和用例.本文并不是 ...
- python之FTP上传和下载
# FTP操作 import ftplib host = '192.168.20.191' username = 'ftpuser' password = 'ftp123' file = '1.txt ...
- P2209 [USACO13OPEN]燃油经济性Fuel Economy
题面 sol:(思想):开一个大根堆和一个小根堆,每次计算到下了一个加油站用掉的油时尽量用小根堆中的元素,且同时删去大根堆中的相应位置的元素,当前加油站如果足够便宜,就可以把大根堆中的元素替换掉: ( ...
- 13函数式编程&Stream流
13.1常用的函数式接口总结 接口名称 方法名称 抽象/默认 延迟/终结 方法描述 Supplier get 抽象 终结 供给型接口,无参有返回值,主要用于 Consumer accept 抽象 ...
- (未完成...)Python3网络爬虫(2):利用urllib.urlopen向有道翻译发送数据并获得翻译结果
环境: 火狐浏览器 pycharm2017.3.3 python3.5 1.url不仅可以是一个字符串,例如:http://www.baidu.com.url也可以是一个Request对象,这就需要我 ...