使用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');

發佈了79 篇原創文章 · 獲贊 1 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章