Oracle全文索引使用方法

2021-07-25 14:10:35 字數 2339 閱讀 1617

接近千萬資料表中有個name欄位,存放中文名稱,現在需要根據name欄位模糊匹配查詢資料,一般的做法是對name欄位建立b*tree索引,查詢用like'%name%',但是經過測試,這種寫法沒有走索引,而是全表掃瞄,可想而知效能有問題。所以採用了oracle提供的全文索引技術,下面詳細介紹下如何使用全文索引。

由oracle索引來理解arcsde索引

oracle索引技術之如何建立最佳索引

oracle索引列null值引發執行計畫該錶的測試示例

oracle索引 主鍵影響查詢速度

oracle索引掃瞄

1.使用前提

3) 把ctx_ddl的執行許可權賦於當前使用者: grant execute on ctx_ddl to 當前使用者;

2.建立分析器

oracle text的分析器,將需要檢索的記錄,按照一定的方式進行片語拆分,然後存放在索引表中。檢索的時候根據索引表中存放的拆分片語,對傳入的關鍵字進行匹配,並返回匹配結果。

oracle text中的分析器有3種:

1) basic_lexer:針對英文,只能根據空格和標點來進行拆分。比如「中國深圳」,只能拆分為「中國深圳」乙個詞,根據「中國」或者「深圳」就搜尋不到。

2) chinese_vgram_lexer:專門的漢語分析器,按字單元進行拆分,比如「中國深圳」,可以拆分為「中」、「中國「、」國深」、「深圳」、「圳」五個片語。這種方式的好處是能夠將所有有可能的片語全部儲存進索引表,使得資料不會遺漏,但是效率上來說就差強人意了。

3) chinese_lexer:一種新的漢語分析器,能夠認識大部分常用的漢語詞彙,較與chinese_vgram_lexer機械式的拆分,能夠按常用詞彙進行拆分儲存。比如「中國深圳」,只會被拆分為「中國」、「深圳」兩個片語。

具體語法為:

ctx_ddl.drop_preference('testlex');--刪除

ctx_ddl.create_preference('testlex','chinese_lexer');--建立乙個「chinese_lexer」分析器,名稱為「testlex」

3.建立過濾片語

假設根據公司名稱進行檢索,一般情況下我們不希望,當輸入「公司」、「股份公司」、「****」等能夠檢索出來結果,所以需要對這些關鍵字進行過濾。當然如果沒有這種特殊的需求,可以不用建立過濾片語的。

1) 建立乙個過濾器,名稱為「teststoplist」

exec ctx_ddl.create_stoplist('teststoplist');

2) 新增自定義需要過濾的片語,以下內容的意思是「公司」、「股份公司」、「****」這些片語不會建立索引,不會被檢索到。

ctx_ddl.add_stopword('teststoplist','****');

ctx_ddl.add_stopword('teststoplist','公司');

ctx_ddl.add_stopword('teststoplist','股份公司');

4.建立索引

create index idx_test  on test(name) indextype is ctxsys.context parameters('lexertestlex stoplistteststoplist');

以上語句的意思是在test表name欄位上建立全文索引,索引型別為ctxsys.context,用到了上面建立的分析器「testlex」、過濾片語「teststoplist」。

建立完索引之後,可以看到生成了如下幾個表:dr$idx_test$i;dr$idx_test$k;dr$idx_test$n;dr$idx_test$r;其中dr$idx_test$i表存放的就是name欄位分詞後的資料。

5.使用索引

oracle全文索引使用時,sql語句必須使用contains關鍵字,具體如下:

select * from test where contains(name,'深圳') > 0;

如果需要根據匹配程度來排序,如下:

select score(1),t.* from test t where contains(name,'深圳',1)>0 order by score(1) desc;

6.索引維護

對錶的dml操作是不會更新全文索引的,這個也是全文索引的乙個特點,索引我們必須手動去維護索引,具體寫法如下:

exec ctx_ddl.sync_index('idx_test');--同步索引,將新的資料同步到索引

exec ctx_ddl.optimize_index('idx_test','full');--優化索引,清楚已刪除的資料

總結:oracle全文索引是一種用空間換取時間的一種技術,再加上dml操作不能自動同步到索引,需要手動定期維護,所以適用場景也不是很廣泛。因此,選擇使用時請慎重。

ORACLE 全文索引

6 全文索引查詢語句contains select count from tablename t where contains t.name,農業銀行 公司 0 select from tablename t where contains t.name,農業 安徽 中 部 0 select from...

Oracle全文索引

zt 步驟三 設定詞法分析器 lexer oracle實現全文檢索,其機制其實很簡單。即通過oracle專利的詞法分析器 lexer 將文章中所有的表意單元 oracle 稱為 term 找出來,記錄在一組 以dr 開頭的表中,同時記下該term出現的位置 次數 hash 值等資訊。檢索時,orac...

全文索引的使用

sp fulltext database enable 啟動全文索引 sp fulltext catalog member info create 建立全文索引目錄 create unique index pk memberid on member memberid 需要建立唯一索引 sp full...