Oracle 9i 全文檢索索引簡單配置方式
1、先決條件
Oracle 9I 預設全部支援,具體如下
系統中存在CTXSYS使用者及CTXAPP角色,
監聽程式支援全文檢索索引,如下
# LISTENER.ORA Network Configuration File: D:/oracle/ora92/network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = server)(PORT = 1521))
)
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:/oracle/ora92)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = server)
(ORACLE_HOME = D:/oracle/ora92)
(SID_NAME = server)
)
)
2、設定文法分析器
在CTXSYS下,預設使用的是basic_lexer,對英文支援比較好,為支援中文,做如下設定
begin ctx_ddl.create_preference('my_lexer','chinese_vgram_lexer'); end;
3、執行個體
在使用者search下search_catalog表的page_desc,link_tile需要進行全文檢索索引,如下
create index index_text on search_catalog(page_desc) indextype is ctxsys.context parameters('lexer ctxsys.my_lexer');
create index index_title on search_catalog(link_title) indextype is ctxsys.context parameters('lexer ctxsys.my_lexer');
//可以修改index 的儲存空間,最簡單的方法是建立在其他使用者的預設儲存空間上
grant create any index to "search";
grant alter any index to "search";
create index shiyq_index.index_text on search_catalog(page_desc) indextype is ctxsys.context parameters('lexer ctxsys.my_lexer');
create index shiyq_index.index_title on search_catalog(link_title) indextype is ctxsys.context parameters('lexer ctxsys.my_lexer');
//可以定製儲存空間
同步(當未經處理資料變化時,索引不會自動重建,所以需要手工同步)
alter index index_text rebuild online parameters('sync');
alter index index_title rebuild online parameters('sync');
或
alter index shiyq_index.index_text rebuild online parameters('sync');
alter index shiyq_index.index_title rebuild online parameters('sync');
4、結果
select t.*, t.rowid from search_catalog t
where instr(t.page_desc,'健康')>0
select * from search_catalog where contains(page_desc,'健康')>0
5、補遺:
這種情況下當檢索一個單詞的時候,會使用兩個欄位的全文檢索索引,使用and ,or 來串連,這樣效能比較低,
而且容易造成cpu的瓶頸,所以可以將兩個欄位合為一個,如將link_title增加到page_desc的後面,然後
Sql由
select * from search_catalog t where contains(t.link_title,'健康')>0 and contains (t.page_desc,
'健康')>0
修改為
select * from search_catalog t where contains(t.page_desc,'健康')>0
如果搜尋多個單詞,可以用邏輯符號,如 邏輯與(and 或 & ),邏輯或(or 或 | ),邏輯非(not 或 ~),可以
用括弧組織
如搜尋包含“健康”,“藥品”或“產品”,但不包含“海虹”的資料
select * from search_catalog t where contains(t.page_desc,'( 健康 & ( 藥品 | 產品) ) ~ 海虹 ')>0
參考了玉面飛龍的大作,這篇文章非常好,我寫的非常簡單,有問題可以去看看http://epub.itpub.net/4/1.htm,