全文检索(oracle text)
Oracle Text使Oracle9i具备了强大的文本检索能力和智能化的文本管理能力,Oracle Text是Oracle9i采用的新名称,在oracle8/8i中被称为oracle intermedia text,oracle8以前是oracle context cartridge。Oracle Text的索引和查功能并不局限于存储在数据库中的数据。它可以对存储于文件系统中的文档进行检索和查,并可检索超过150种文档类型,包括Microsoft Word、PDF和XML。Oracle Text查功能包括模糊查、词干查(搜索mice 和查mouse)、通配符、相近性等查方式,以及结果分级和关键词突出显示等。你甚至可以增加一个词典,以查搭配词,并出包含该搭配词的文档。
Oracle text 需要为可检索的数据项建立索引,用户才能够通过搜索查内容,索引进程是根据管道建模的,在这个管道中,数据经过一系列的转换后,将其关键字会添加到索引中。该索引进程分为多个阶段,如下图
1.数据检索(Datastore):只是将数据从数据存储(例如web页面、数据库大型对象或本地文件系统)中取出,然后作为数据流传送到下一个阶段。
2. 过滤(Filter):过滤器负责将各种文件格式的数据转换为纯文本格式,索引管道中的其他组件只能处理纯文本数据,不能识别 Ms word 或 excel 等文件格式。
3. 分段(Sectioner):分段器添加关于原始数据项结构的元数据。
4. 词法分析(Lexer):根据数据项的语言将字符流分为几个字词。
5. 索引(Index):最后一个阶段将关键字添加到实际索引中。
测试环境:
Linux AS release 4 (Nahant Update 3), oracle10g(10.2.0.2.0)
内容简介:
本文档主要以实验为主,文档中包含了大量的实验例子,部分测试用例来自document,部分来自网友的测试,所有的例子都在oracle10g中测试通过。
(1).
配置oracle text
9i之前,Oracle Text不是默认安装的,必须手工安装。检查数据库中是否有ctxsys用户和ctxapp脚,如果没有这个用户和角,这意味着你在创建数据库时没有安装oracle text 功能,需要先配置上该功能。
9i安装text
--创建表空间
SQL>create tablespace drsys datafile '/opt/oracle10g/oradata/10gtest/drsys01.dbf' size 100m;
SQL> connect / as sysdba
--创建ctxsys用户
SQL> @?/ctx/admin/dr0csys password default_tablespace_name temporary_tablespace_name SQL> connect ctxsys/password
--创建数据字典
SQL> @?/ctx/admin/dr0inst @?/ctx/lib/libctxx9.so
SQL> @?/ctx/admin/defaults/drdefus.sql ;
Oracl0g安装text:
SQL> connect / as sysdba
SQL> @?/ctx/admin/catctx.sql ctxsys TBS_DRSYS temp unlock
Conn ctxsys/ctxsys
SQL> @?/ctx/admin/defaults/drdefel.sql
(2).
创建测试用户oratext
Alter user ctxsys identified by ctxsys account unlock(10g默认安装,帐号被锁定);
Create tablespace oratext datafile '/opt/oracle10g/oradata/10gtest/oratext01.dbf' size 2000m ;
Create user oratext identified by oratect default tablespace oratext temporary tablespace temp;
Alter database tempfile '/opt/oracle10g/oradata/10gtest/temp01.dbf' resize 2000m; SQL>Create user oratext identified by oratext default tablespace oratext temporary tablespace temp;
Grant resource, connect, ctxapp to oratext;
Grant execute _cls to oratext;
Grant execute _ddl to oratext;
Grant execute _doc to oratext;
Grant execute _output to oratext;
Grant execute _query to oratext;
Grant execute _report to oratext;
Grant execute _thes to oratext;
Grant execute _ulexer to oratext;
查看系统默认的oracle text参数
Select pre_name, pre_object from ctx_preferences
(3).
Oracle Text索引原理
Oracle text 索引将文本中所有的字符转化成记号(token),如www.taobao会转化成www,taobao,com这样的记号。
Oracle10g里面支持四种类型的索引,context,ctxcat,ctxrule,ctxxpath
索引类型 描述 查询操作符安装oracle10g
CONTAINS CONTEXT用于对含有大量连续文本数据进行检索。支持word、html、xml、text
等很多数据格式。支持范围(range)分区,支持并行创建索引(Parallel
indexing)的索引类型。支持类型:VARCHAR2, CLOB, BLOB, CHAR, BFILE,
XMLType, and URIType.
DML操作后,需要CTX_DDL.SYNC_INDEX 手工同步索引
如果有查询包含多个词语,直接用空格隔开(如 oracle itpub)
CTXCAT适用于混合查询语句(如查询条件包括产品id,价格,描述等)。适
CATSEARCH 合于查询较小的具有一定结构的文本段。
具有事务性。DML操作后,索引会自动进行同步。
操作符:and,or,>,<, =,between,in
MATCHES CTXRULE Use CTXRULE index to build a document classification or routing
application. The CTXRULE index is an index created on a table
of queries, where the queries define the classification or
routing criteria.
CTXXPATH Create this index when you need to speed up existsNode() queries
on an XMLType column.
1.
Context索引
Oracle text索引把全部的word转化成记号,context 索引的架构是反向索引(inverted index),每个记号都映射着包含它自己的文本位置,如单词dog可能会有如下的条目
Dog Doc1 Doc3 Doc5
这表示dog在文档doc1,doc3,doc5中都出现过。索引建好之后,系统中会自动产生如下DR$MYINDEX$I,DR$MYINDEX$K,DR$MYINDEX$R,DR$MYINDEX$X,MYTABLE5个表(假设表为mytable,索引为myindx)。Dml操作后,context索引不会自动同步,需要利用ctx_ddl.sync_index手工同步索引。
例子:
Create table docs (id number primary key, text varchar2(200));
Insert into docs values(1, '<html>california is a state in the us.</html>'); Insert into docs values(2, '<html>paris is a city in france.</html>');
Insert into docs values(3, '<html>france is in europe.</html>');
Commit;
/
--建立context 索引
Create index idx_docs on docs(text)
indextype t parameters
('filter ctxsys.null_filter section group ctxsys.html_section_group');
--查询
Column text format a40;
Select id, text from docs where contains(text, 'france') > 0;
id text
---------- -------------------------------
3 <html>france is in europe.</html>
2 <html>paris is a city in france.</html>
--继续插入数据
Insert into docs values(4, '<html>los angeles is a city in california.</html>'); Insert into docs values(5, '<html>mexico city is big.</html>');
commit;
Select id, text from docs where contains(text, 'city') > 0;--新插入的数据没有查询到
id text
--------------------------------------------
2 <html>paris is a city in france.</html>
--索引同步
begin
ctx_ddl.sync_index('idx_docs', '2m');
end;
--查询
Column text format a50;
Select id, text from docs where contains(text, 'city') > 0; --查到数据
id text
-----------------------------------------------
5 <html>mexico city is big.</html>
4 <html>los angeles is a city in california.</html>
2 <html>paris is a city in france.</html>
-- or操作符
Select id, text from docs where contains(text, 'city or state ') > 0;
-
-and 操作符
Select id, text from docs where contains(text, 'city and sta te ') > 0;
或是
Select id, text from docs where contains(text, 'city sta te ') > 0;
--score表示得分,分值越高,表示查到的数据越精确
SELECT SCORE(1), id, text FROM docs WHERE CONTAINS(text, 'oracle', 1) > 0;
Context类型的索引不会自动同步,这需要在进行Dml后,需要手工同步索引。与context索引相对于的查询操作符为contains
语法:
Contains(
[schema.]column,
text_query varchar2
[,label number])
Return number;
indextype t: 表示所定义的索引类型为context
2.
Ctxcat索引
用在多列混合查询中
Ctxcat可以利用index set建立一个索引集,把一些经常与ctxcat查询组合使用的查询列添加到索引集中。比如你在查询一个商品名时,还需要查询生产日期,价格,描述等,你可可以将这些列添加到索引集中。oracle 将这些查询封装到catsearch操作中,从而提高全文索引的效率。在一些实时性要求较高的交易上,context的索引不能自动同步显然是个问题,ctxcat 则会自动同步索引(原文:This example creates a catalog index for an auction site that sells electronic equipment such as cameras and CD players. New inventory is added everyday and item descriptions, bid dates, and prices must be stored together.The application requires good response time for mixed queries. The key is to determine what columns users frequently search so that we can create a suitable CTXCAT index. Queries on this type
of index are issued with the CATSEARCH operator.)
例子:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论