ORACLE TEXT(轉)

zhouwf0726發表於2019-01-16
使用ORACLE TEXT進行文字搜尋

查詢文字不同於查詢資料,因為有同義詞、近義詞和反義詞。你可能希望搜尋互相接近的詞或搜尋相關聯的詞。如果僅使用標準的關係操作符,要進行這些查詢是非常困難的。通過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');


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/756652/viewspace-242302/,如需轉載,請註明出處,否則將追究法律責任。

相關文章