Oracle的全文检索,以前用过,效果还可以,就是耗资源。
现在这里也在考虑使用全文检索,自己印象中有两种:
1. Oracle的全文检索(CTX),虽然其他数据库也有全文检索,不过这里用的是Oracle,也就看看Oracle的全文检索 --- 以前用的全文检索也是Oracle,正好数据库一样;
2. Apache基金会的Lucene, 后续有企业级升级版应用 Solr
Lucene以前也用过,Solr没有用过;
以前用Lucene的时候,Solr还没有出现,在多机使用同一套Lucene索引貌似还有一定讲究,时间长了,不记得了。
这里先抄一篇对Oracle全文检索讲的比较清晰的文章(以前用过,所以一看简单说明,全部能记起来)
http://blog.itpub.net/10597729/viewspace-741700/
其实这篇文章也是转载ITPUT论坛上的一篇文章
转载自:http://www.iteye.com/topic/1118055
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全文检索技术提供了强大的文本搜索和分析能力,使得在大规模文本数据中快速定位相关信息成为可能。它结合了词法分析、索引优化和高效的查询语法,为开发人员和DBA提供了高效处理文本信息的工具,极...
Oracle 全文检索实现 Oracle 全文检索实现是通过 Lucene 实现的,全文检索是指在数据库中检索特定关键字的记录。这一实现的思路是将数据库中的记录对应索引文件中的一个文档,表主键直接存储在索引文件中,而非主键...
Oracle全文检索技术是一种强大的信息检索工具,它允许用户在数据库中的文本数据上执行复杂的搜索操作。从Oracle 7版本开始,Oracle就开始提供全文检索功能,起初名为Oracle ConText Cartridge,随后在Oracle 8/8i中...
ORACLE 全文检索 Oracle 全文检索是指 Oracle 对系统文件的全文检索,支持多种文件格式,包括 doc、pdf、txt、html、Word 文档、Excel 表格、PowerPoint 等。下面我们将详细讲解 Oracle 全文检索的知识点。 一、 ...
### Oracle全文检索技术详解 #### 一、Oracle Text 概述 Oracle Text 是 Oracle 数据库的一项强大特性,它使得 Oracle9i 及后续版本具备了先进的文本检索与智能化管理功能。这一特性最早在 Oracle8 之前的版本中被...
Oracle全文检索是Oracle数据库系统中的一种高级特性,用于在数据库中的文本数据中执行高效、复杂的全文搜索。在本文中,我们将深入探讨如何安装和配置Oracle Text,以及它所依赖的关键角色和用户。 首先,要使用...
oracle 全文检索 oracle全文索引 多列字段检索,匹配多列字段搜索功能。
Oracle全文检索是指在Oracle数据库中对大量文本数据进行搜索和检索的技术。通过使用Oracle提供的全文检索功能,可以快速、准确地检索大量文本数据。 一、基本概念 Oracle全文检索的基础是CTXSYS用户和CTXAPP角色。...
Oracle 全文检索应用是Oracle数据库中的一项重要功能,它允许用户在大量文本数据中高效地查找相关信息。Oracle Text是Oracle 9i及更高版本中的组件,它提供了高级的全文检索和文本管理能力。Oracle Text的前身在...
Oracle全文检索是一种强大的功能,它允许在数据库中的文本字段中进行复杂的搜索操作。在Oracle数据库中,全文检索主要依赖于Oracle Text组件,它提供了高级的文本分析和检索能力。以下是对Oracle全文检索实例的详细...
Oracle全文检索
Oracle全文检索是数据库管理系统Oracle中的一个强大功能,它允许用户以自然语言的形式搜索数据库中的文本信息,而不仅仅是基于关键字的精确匹配。Oracle的全文检索功能提供了高效、灵活且可定制的搜索体验,对于处理...
随着技术的演进,全文检索技术已经成为了新一代管理信息系统的代名词,它不仅在传统搜索引擎中占据核心位置,还在智能化、网络化的趋势下展现出良好的发展前景和广阔的应用空间。 6. 具体应用场景分析: 文档中...
Oracle全文检索是一种强大的文本搜索工具,自Oracle 7.3版本开始引入,旨在帮助用户高效地在大量文本数据中进行查找操作。在Oracle 9i中,这一功能被称为Oracle Text,它被集成到标准版和企业版数据库中,无需额外...
ORACLE全文检索PPT 讲解各种搜索