Posted on 2007-01-10 13:50
忆了又忆 阅读(2055)
评论(0) 编辑 收藏
查询文本不同于查询数据,因为有同义词、近义词和反义词。你可能希望搜索互相接近的词或搜索相关联的词。如果仅使用标准的关系操作符,要进行这些查询是非常困难的。通过SQL进行扩充,使其包含文本索引,则ORACLE TEXT允许用户就文本提出非常复杂的问题。
文本索引主要有两种CONTEXT和CTXCAT
用如下方式建立索引
CREATE INDEX REVIEW_CONTEXT_INDEX ON BOOK_REVIEW_CONTEXT(REVIEW_TEXT) INDEXTYPE IS CTXSYS.CONTEXT;
或
CREATE INDEX REVIEW_CTXCAT_INDEX ON BOOK_REVIEW_CTXCAT(REVIEW_TEXT) INDEXTYPE IS CTXSYS.CTXCAT;
建立好索引后就可以进行文本查询
select title from book_review_context where contains(review_text,'property')>0
CONTAINS函数有两个参数即列名和搜索串,它检查review_text列的文本索引。如果在review_text列的文本索引中找到单词'property'则数据库返回的得分大于0,并返回匹配的TITLE值。
如果建立的是CTXCAT索引就用CATSEARCH函数
select title from book_review_ctxcat where catsearch(review_text,'property',null)>0;
可使用的文本查询表达式有以下几种:
1。单词的精确匹配搜索
select title from book_review_context where contains(review_text,'property')>0
2。多个单词精确匹配的搜索
可以使用AND连接多个单词
select title from book_review_context where contains(review_text,'property and harvests')>0
还可以使用&但是在SQLPLUS里必须执行set define off否则&将被视作变量
set define off
select title from book_review_context where contains(review_text,'property & harvests')>0
对于CTXCAT索引AND完全可以省略
select title from book_review_ctxcat where catsearch(review_text,'property harvests',null)>0;
除AND外还可以使用OR运算符在ORACLE TEXT中OR是一根竖线(|)
因此下面的两个查询是等同的
select title from book_review_context where contains(review_text,'property or harvests')>0
select title from book_review_context where contains(review_text,'property | harvests')>0
但是要注意CATSEARCH函数不支持OR只支持‘|’符号;
ACCUM(累加)提供了另一种组合搜索的方法。等价于逗号,所以下面的两个查询是等价的
select title from book_review_context where contains(review_text,'property accum harvests')>0
select title from book_review_context where contains(review_text,'property , harvests')>0
但是CATSEARCH函数调用支持ACCUM语法但不应该使用,因为CATSEARCH不计算用来与阀值进行比较的得分;
MINUS运算符从第一项搜索的得分中减去第二项搜索的得分等价于减号,所以下面的两个查询是等价的
select title from book_review_context where contains(review_text,'property minus harvests')>0
select title from book_review_context where contains(review_text,'property - harvests')>0
可以用圆括号来阐明搜索条件内的逻辑
select title from book_review_context where contains(review_text,'house or (workers and harvests')>0
3。短语精确匹配的搜索
在进行短语搜索的时候应将整个短语作为搜索串的一部分
select title from book_review_context where contains(review_text,'doctor visits')>0
若搜索的短语中包含ORACLE TEXT内的保留字,则必须使用花括号括住相应的保留字
select title from book_review_context where contains(review_text,'taengdmg {and} dfdng)>0
4。搜索互相接近的词
select title from book_review_context where contains(review_text,'property near harvests')>0
可以使用关键词NEAR也可以用;代替NEAR
5。在搜索中使用通配符
select title from book_review_context where contains(review_text,'worker%')>0
select title from book_review_context where contains(review_text,'work___)>0
6。搜索具有相同词根的词
select title from book_review_context where contains(review_text,'$worker')>0
7。模糊匹配搜索
select title from book_review_context where contains(review_text,'?worker')>0
8。搜索发音相似的词
select title from book_review_context where contains(review_text,'!worker')>0
9。使用ABOUT运算符
在ORACLE TEXT中可以搜索文档的主题
select review_text from book_review_context where contains(review_text,'about(mdgd)')>0
10。索引集
为了建立一个名为reviews的索引集可使用CREATE_INDEX_SET过程
execute ctx_ddl.create_index_set('reviews)
可以通过add_index过程添加索引到索引集中了
execute ctx_ddl.add_index('reviewers','reviewer');