2011-10-13 100 views
6

我想索引的查詢像x like '%abc%'如何爲'%abc%'搜索創建文本索引?

如果我有一個表像下面的

create table t 
(
    data varchar(100) 
); 

我想創建一個索引能夠做到有效地執行以下操作:

select * from t where contains('%abc%'); 

這:

select * from t where contains('abc%'); 

我也希望這張桌子現場更新。

如何創建這樣的索引? (我有一種感覺,我需要一個ctxcat索引,但我很困惑我需要給它什麼選擇)

我正在使用Oracle 10g。你的問題

回答

7

我會用這個(設置你MIN和MAX長度appropiate值)

BEGIN 
    ctx_ddl.create_preference ('FT_WL', 'BASIC_WORDLIST'); 
    ctx_ddl.set_attribute  ('FT_WL', 'substring_index', 'YES'); 
    ctx_ddl.set_attribute  ('FT_WL', 'prefix_index',  'YES'); 
    ctx_ddl.set_attribute  ('FT_WL', 'prefix_min_length', 1); 
    ctx_ddl.set_attribute  ('FT_WL', 'prefix_max_length', 6); 
    END; 

CREATE INDEX fulltext_idx ON tmp_fulltext (fulltext) 
INDEXTYPE IS CTXSYS.CTXCAT 
PARAMETERS ('WORDLIST FT_WL') 

的參數在這裏解釋Oracle Text Reference

並看到如何管理刷新以及索引可能不會比具有高基數數據的全掃描更快的問題:

PL/SQL Performance Tuning for LIKE '%...%' Wildcard Queries

+1

感謝您的答案。只有幾個問題:對於'abc%'查詢,'prefix_index'和'%abc%'查詢都是'substring_index'?並且默認的子串索引是否索引所有的子串?另外,我該如何使用這個索引?將'包含(col,'%abc%')'和'contains(col,'abc%')'做詭計嗎? – Clinton

+0

是的,這些搜索將起作用,已經更新了一個可以比我更好地解釋它的鏈接,但實質上這些參數用於改善那種類型搜索的性能。 –

0

看,如果你的數據庫是很大的,那麼你可以使用Sphinx Search

獅身人面像一個開源的全文搜索服務器,從地上爬起來,性能,相關性設計(又名搜索質量),並整合簡化心裏。它是用C++編寫的,適用於Linux(RedHat,Ubuntu等),Windows,MacOS,Solaris,FreeBSD和其他一些系統

+0

這看起來很有趣,但可悲的是我堅持從Oracle 10g。 – Clinton

+0

相信我快速,也可以生活更新索引.... – Wazzzy

0

只有當你有intermedia/Oracle Text選項服務器...

爲了您例如,你可以使用

create index t_index_data on t(data) 
indextype is ctxsys.context 
parameters ('DATASTORE CTXSYS.DEFAULT_DATASTORE'); 

我不知道,如果你需要的類型更改從varchar2(100)clob

有關這類指標的詳細信息和選項/例子中看到http://download.oracle.com/docs/cd/A91202_01/901_doc/text.901/a90122/ind4.htm

+0

你確定這個索引子字符串?我閱讀文檔,看起來像我需要一個「首選」「SUBSTRING_INDEX」或什麼的。你可以給我一個代碼示例,我正在尋找包括子字符串索引? – Clinton

+0

你可能是正確的偏好 - 我沒有一個Oracle服務器與這些選項可用,所以我不能測試它... – Yahia

1

是的,你需要創建一個環境,然後才能創建域索引。你需要有ctxsys用戶和必要的ctxapp previliges來創建它。按照下面鏈接中介紹的步驟爲您的環境創建一個。安裝oracle時默認不創建此用戶。

http://www.oraclebin.com/2012/12/creating-environment-for-ctxsys.html

一旦你的所有的贈款和包,您可以創建喜好和索引,如圖所示。

SQL> begin 
    2 ctx_ddl.create_preference('SUBSTRING_PREF', 'BASIC_WORDLIST'); 
    3 ctx_ddl.set_attribute('SUBSTRING_PREF', 'SUBSTRING_INDEX','TRUE'); 
    4 end; 
    5/

現在創建一個域索引,如圖所示。

SQL> create index test_idx on test(object_name) 
    2 indextype is ctxsys.context parameters ('wordlist SUBSTRING_PREF MEMORY 50M'); 

Index created. 

select * from test where contains(object_name,'%EXEC%') > 0; 

請參閱下面的鏈接,以解釋執行計劃。

參考文獻:http://www.oraclebin.com/2012/12/oracle-text-and-domain-indexes.html