Oracle全文检索方面的研究全Word文件下载.docx
- 文档编号:6180000
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:73
- 大小:39.77KB
Oracle全文检索方面的研究全Word文件下载.docx
《Oracle全文检索方面的研究全Word文件下载.docx》由会员分享,可在线阅读,更多相关《Oracle全文检索方面的研究全Word文件下载.docx(73页珍藏版)》请在冰点文库上搜索。
2、OracleText索引原理
Oracletext索引将文本中所有的字符转化成记号(token),如会转化
成www,taobao,com这样的记号。
Oracle10g里面支持四种类型的索引,context,ctxcat,ctxrule,ctxxpath
2.1Context索引
Oracletext索引把全部的word转化成记号,context索引的架构是反向索引(inverted
index),每个记号都映射着包含它自己的文本位置,如单词dog可能会有如下的条目
这表示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手工同步索引。
例子:
Createtabledocs(idnumberprimarykey,textvarchar2(200));
Insertintodocsvalues(1,'
<
html>
californiaisastateintheus.<
/html>
'
);
Insertintodocsvalues(2,'
parisisacityinfrance.<
Insertintodocsvalues(3,'
franceisineurope.<
Commit;
/
--建立context索引
Createindexidx_docsondocs(text)
indextypeisctxsys.contextparameters
('
filterctxsys.null_filtersectiongroupctxsys.html_section_group'
--查询
Columntextformata40;
--字符串截为40位显示。
Selectid,textfromdocswherecontains(text,'
france'
)>
0;
idtext
-----------------------------------------
3<
2<
--继续插入数据
Insertintodocsvalues(4,'
losangelesisacityincalifornia.<
Insertintodocsvalues(5,'
mexicocityisbig.<
commit;
city'
--新插入的数据没有查询到
--------------------------------------------
--索引同步
begin
ctx_ddl.sync_index('
idx_docs'
'
2m'
--使用2M同步索引
end;
Columntextformata50;
--查到数据
-----------------------------------------------
5<
4<
--or操作符
cityorstate'
--and操作符
cityandstate'
或是
citystate'
--score表示得分,分值越高,表示查到的数据越精确
SELECTSCORE
(1),id,textFROMdocsWHERECONTAINS(text,'
oracle'
1)>
Context类型的索引不会自动同步,这需要在进行Dml后,需要手工同步索引。
与context索引相对于的查询操作符为contains
2.2Ctxcat索引
用在多列混合查询中
Ctxcat可以利用indexset建立一个索引集,把一些经常与ctxcat查询组合使用的查询列添加到索引集中。
比如你在查询一个商品名时,还需要查询生产日期,价格,描述等,你可可以将这些列添加到索引集中。
oracle将这些查询封装到catsearch操作中,从而提高全文索引的效率。
在一些实时性要求较高的交易上,context的索引不能自动同步显然是个问题,ctxcat则会自动同步索引
Createtableauction(Item_idnumber,Titlevarchar2(100),Category_idnumber,Pricenumber,Bid_closedate);
Insertintoauctionvalues(1,'
nikoncamera'
1,400,'
24-oct-2002'
Insertintoauctionvalues(2,'
olympuscamera'
1,300,'
25-oct-2002'
Insertintoauctionvalues(3,'
pentaxcamera'
1,200,'
26-oct-2002'
Insertintoauctionvalues(4,'
canoncamera'
1,250,'
27-oct-2002'
--确定你的查询条件(很重要)
--Determinethatallqueriessearchthetitlecolumnforitemdescriptions
--建立索引集
ctx_ddl.create_index_set('
auction_iset'
ctx_ddl.add_index('
'
price'
/*sub-indexa*/
--建立索引
Createindexauction_titlexonauction(title)indextypeisctxsys.ctxcat
parameters('
indexsetauction_iset'
Columntitleformata40;
Selecttitle,pricefromauctionwherecatsearch(title,'
camera'
orderbyprice'
)>
Titleprice
-------------------------
Pentaxcamera200
Canoncamera250
Olympuscamera300
Nikoncamera400
Insertintoauctionvalues(5,'
aigocamera'
1,10,'
Insertintoauctionvalues(6,'
lencamera'
1,23,'
--测试索引是否自动同步
price<
=100'
0;
aigocamera10
lencamera23
添加多个子查询到索引集:
ctx_ddl.drop_index_set('
/*sub-indexA*/
price,bid_close'
/*sub-indexB*/
dropindexauction_titlex;
SELECT*FROMauctionWHERECATSEARCH(title,'
price=200orderbybid_close'
orderbyprice,bid_close'
任何的Dml操作后,Ctxcat的索引会自动进行同步,不需要手工去执行,与ctxcat索引相对应的查询操作符是catsearch.
语法:
Catsearch(
[schema.]column,
Text_queryvarchar2,
Structured_queryvarchar2,
Returnnumber;
catsearch(text,'
dog'
foo>
15'
)
bar='
SMITH'
foobetween1and15'
foo=1andabc=123'
2.3Ctxrule索引
Thefunctionofaclassificationapplicationistoperformsomeactionbasedondocumentcontent.
Theseactionscanincludeassigningacategoryidtoadocumentorsendingthedocumenttoauser.
Theresultisclassificationofadocument.
Createtablequeries(query_idnumber,query_stringvarchar2(80));
insertintoqueriesvalues(1,'
insertintoqueriesvalues(2,'
larryorellison'
insertintoqueriesvalues(3,'
oracleandtext'
insertintoqueriesvalues(4,'
marketshare'
Createindexqueryxonqueries(query_string)indextypeisctxsys.ctxrule;
Columnquery_stringformata35;
Selectquery_id,query_stringfromqueries
wherematches(query_string,
oracleannouncedthatitsmarketshareindatabases
increasedoverthelastyear.'
query_idquery_string
---------------------------------------------
1oracle
4marketshare
在一句话中建立索引匹配查询
2.4Ctxxpath索引
CreatethisindexwhenyouneedtospeedupexistsNode()queriesonanXMLTypecolumn
3.索引的内部处理流程
3.1Datastore属性
数据检索负责将数据从数据存储(例如web页面、数据库大型对象或本地文件系统)
中取出,然后作为数据流传送到下一个阶段。
Datastore包含的类型有Directdatastore,
Multi_column_datastore,Detail_datastore,File_datastore,Url_datastore,User_datastore,
Nested_datastore。
3.1.1.Directdatastore
支持存储数据库中的数据,单列查询.没有attributes属性
支持类型:
char,varchar,varchar2,blob,clob,bfile,orxmltype.
Createtablemytable(idnumberprimarykey,docsclob);
Insertintomytablevalues(111555,'
thistextwillbeindexed'
Insertintomytablevalues(111556,'
thisisadirect_datastoreexample'
--建立directdatastore
Createindexmyindexonmytable(docs)
indextypeisctxsys.context
datastorectxsys.default_datastore'
Select*frommytablewherecontains(docs,'
text'
3.1.2.Multi_column_datastore
适用于索引数据分布在多个列中
thecolumnlistislimitedto500bytes
支持number和date类型,在索引之前会先转化成textt
rawandblobcolumnsaredirectlyconcatenatedasbinarydata.
不支持long,longraw,nchar,andnclob,nestedtable
Createtablemytable1(idnumberprimarykey,doc1varchar2(400),doc2clob,doc3
clob);
Insertintomytable1values(1,'
followingexamplecreatesamulti-column'
denotesthatthebarcolumn'
Insertintomytable1values(2,'
usethisdatastorewhenyourtextisstoredinmorethanonecolumn'
thesystemconcatenatesthetextcolumns'
--建立multidatastore类型
Begin
Ctx_ddl.create_preference('
my_multi'
multi_column_datastore'
Ctx_ddl.set_attribute('
columns'
doc1,doc2,doc3'
End;
Createindexidx_mytableonmytable1(doc1)indextypeisctxsys.context
parameters('
datastoremy_multi'
Select*frommytable1wherecontains(doc1,'
directdatastore'
examplecreates'
注意:
检索时,检索词对英文,必须是有意义的词,比如,
morethanonecolumn'
可以查出第二条纪录,但你检索more将没有显示,因为more在那句话中不是有意义的一个词。
--只更新从表,看是否能查到更新的信息
Updatemytable1setdoc2='
adladlhadadthisdatastorewhenyourtextisstoredtest'
where
id=2;
Ctx_ddl.sync_index('
idx_mytable'
adladlhadad'
--没有记录
Updatemytable1setdoc1='
whereid=2;
--更新主表
--同步索引
-查到从表的更新
对于多列的全文索引可以建立在任意一列上,但是,在查询时指定的列必须与索引时指定的
列保持一致,只有索引指定的列发生修改,oracle才会认为被索引数据发生了变化,仅修改
其他列而没有修改索引列,即使同步索引也不会将修改同步到索引中.
也就是说,只有更新了索引列,同步索引才能生效,,要更改其他列的同时也要再写一次即可。
在多列中,对任意一列建立索引即可,更新其他列的同时,在update那个列,同步索引一次即可看到效果了。
3.1.3Detail_datastore
适用于主从表查询(原文:
usethedetail_datastoretypefortextstoreddirectlyinthedatabasein
detailtables,withtheindexedtextcolumnlocatedinthemastertable)
因为真正被索引的是从表上的列,选择主表的那个列作为索引并不重要,但是选定之后,查
询条件中就必须指明这个列
主表中的被索引列的内容并没有包含在索引中
DETAIL_DATASTORE属性定义
createtablemy_master–建立主表
(article_idnumberprimarykey,authorvarchar2(30),titlevarchar2(50),bodyvarchar2
(1));
createtablemy_detail–建立从表
(article_idnumber,seqnumber,textvarchar2(4000),
constraintfr_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle 全文 检索 方面 研究