Oracle全文检索示例
?第一種方法:
一、創建示例表
CREATE TABLE T_FULLTEXT_DEMO
(
ID?NUMBER?NOT NULL,
TITLE?VARCHAR2(100)?NULL,
REMARK?VARCHAR2(200)?NULL,
FILE_NAME?VARCHAR2(200)?NULL,
CONSTRAINT T_FULLTEXT_DEMO_PK PRIMARY KEY ( ID )
);
二、對TITLE和REMARK建立索引
BEGIN
CTXSYS.CTX_DDL.CREATE_PREFERENCE('MYMDS','MULTI_COLUMN_DATASTORE');
CTXSYS.CTX_DDL.SET_ATTRIBUTE('MYMDS', 'COLUMNS', 'TITLE, REMARK');
END;
CREATE INDEX T_FULLTEXT_DEMO_IDX ON T_FULLTEXT_DEMO(TITLE) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('DATASTORE MYMDS');
三、建立存儲選項參數、語法分析器
BEGIN
--CTX_DDL.DROP_PREFERENCE('MY_LEXER');
--CTX_DDL.DROP_PREFERENCE('MY_DATASTORE_PREFS');
CTX_DDL.CREATE_PREFERENCE ('MY_LEXER', 'CHINESE_VGRAM_LEXER');
CTX_DDL.CREATE_PREFERENCE ('MY_DATASTORE_PREFS', 'FILE_DATASTORE');
CTX_DDL.SET_ATTRIBUTE ('MY_DATASTORE_PREFS', 'PATH', 'E:\Projects\My_Documents; E:\Projects\My_Documents\UML_DOC');
END;
四、對文檔建立全文檢索索引
CREATE INDEX T_FULLTEXT_DEMO_FILE_IDX ON T_FULLTEXT_DEMO(FILE_NAME) INDEXTYPE IS CTXSYS.CONTEXT?PARAMETERS('DATASTORE MY_DATASTORE_PREFS LEXER MY_LEXER');
五、插入測試數據
INSERT INTO T_FULLTEXT_DEMO(ID,TITLE,REMARK,FILE_NAME) VALUES(1,'德魯克的《管理:任務、責任、實踐》','管理類書籍','德魯克的《管理:任務、責任、實踐》.doc');
INSERT INTO T_FULLTEXT_DEMO(ID,TITLE,REMARK,FILE_NAME) VALUES(2,'PB控件的屬性事件和函數','PB技術書籍','PB控件的屬性事件和函數.pdf');
INSERT INTO T_FULLTEXT_DEMO(ID,TITLE,REMARK,FILE_NAME) VALUES(3,'微軟產品報價','微軟軟件產品報價','微軟產品報價.xls');
INSERT INTO T_FULLTEXT_DEMO(ID,TITLE,REMARK,FILE_NAME) VALUES(4,'JavaScript 5.5','JavaScript語言幫助文檔','JavaScript 5.5.CHM');
INSERT INTO T_FULLTEXT_DEMO(ID,TITLE,REMARK,FILE_NAME) VALUES(5,'ASCII碼','ASCII碼的各種進制表示方式和代表的意思','ASCII碼.htm');
INSERT INTO T_FULLTEXT_DEMO(ID,TITLE,REMARK,FILE_NAME) VALUES(6,'UML數據庫建模','UML數據庫建模的相關知識','UML數據庫建模.ppt');
六、同步索引和優化索引
若此時檢索,應沒有數據。
select * from T_FULLTEXT_DEMO
where contains(TITLE,'管理')>0;
需要將索引同步
BEGIN
CTXSYS.CTX_DDL.SYNC_INDEX('T_FULLTEXT_DEMO_FILE_IDX');
CTXSYS.CTX_DDL.SYNC_INDEX('T_FULLTEXT_DEMO_IDX');
END;
七、測試全文索引
select * from T_FULLTEXT_DEMO
where contains(TITLE,'管理')>0;
select * from T_FULLTEXT_DEMO
where contains(FILE_NAME,'德魯克')>0;
八、優化索引
BEGIN
CTXSYS.CTX_DDL.OPTIMIZE_INDEX('T_FULLTEXT_DEMO_FILE_IDX','FULL');
CTXSYS.CTX_DDL.OPTIMIZE_INDEX('T_FULLTEXT_DEMO_IDX','FULL');
END;
第二種方法:
一、創建示例表
CREATE TABLE T_FULLTEXT_DEMO
(
ID?NUMBER?NOT NULL,
TITLE?VARCHAR2(100)?NULL,
REMARK?VARCHAR2(200)?NULL,
FILE_NAME?BFILE?NULL,
CONSTRAINT T_FULLTEXT_DEMO_PK PRIMARY KEY ( ID )
);
二、創建虛擬目錄并授權(使用SYSTEM帳號)
CREATE DIRECTORY LOCAL_DIR AS 'E:\Projects\My_Documents';
GRANT READ ON DIRECTORY LOCAL_DIR TO JK_DANGAN;
三、插入示例數據
INSERT INTO T_FULLTEXT_DEMO
VALUES (1, '微軟產品報價', '微軟產品報價',BFILENAME('LOCAL_DIR','微軟產品報價.xls'));
INSERT INTO T_FULLTEXT_DEMO
VALUES (2, '電子商務的瓶頸之我見', '電子商務的瓶頸之我見',BFILENAME(''LOCAL_DIR','電子商務的瓶頸之我見.doc'));
四、創建索引
CREATE INDEX T_FULLTEXT_DEMO_FILE_IDX ON T_FULLTEXT_DEMO(FILE_NAME) INDEXTYPE IS CTXSYS.CONTEXT;
五、測試
select * from T_FULLTEXT_DEMO
where contains(file_name,'數據庫')>0
?
?
?
?
如何使用Oracle全文檢索功能?
作者:eygle?|?English Version?【轉載時請以超鏈接形式標明文章出處和作者信息及本聲明】
鏈接:http://www.eygle.com/archives/2005/06/ecieoaoracleeia.html
站內相關文章|Related Articles
- 如何手工安裝Oracle全文檢索工具?
本文簡要說明全文檢索功能的使用,不做太多的具體說明。
僅供參考使用方法。
1.授權
對具體使用全文檢索的用戶授權.
| $ sqlplus "/ as sysdba"SQL*Plus: Release 9.2.0.4.0 - Production on Sun May 15 20:00:10 2005Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.Connected to: Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production With the Partitioning, OLAP and Oracle Data Mining options JServer Release 9.2.0.4.0 - ProductionSQL> grant ctxapp to club;Grant succeeded.SQL> connect ctxsys/password Connected. SQL> grant execute on ctx_ddl to club;Grant succeeded. |
2.使用應用用戶連接
創建域索引
| SQL> connect club/password Connected.SQL> begin ctx_ddl.create_preference('club_lexer','chinese_vgram_lexer'); end;2 /PL/SQL procedure successfully completed.Elapsed: 00:00:00.03SQL> create index id_cont_msg 2 on jivemessage ( SUBJECT ) indextype is ctxsys.context parameters('lexer club_lexer'); Index created.Elapsed: 00:01:22.42SQL> select count(*) from jivemessage where contains(subject,'幸福')>0;COUNT(*) ----------1847Elapsed: 00:00:00.17 SQL> select count(*) from jivemessage where subject like '%幸福%';COUNT(*) ----------1841Elapsed: 00:00:02.89 |
3.檢索比較
以下是一個全文檢索的示例,我們檢索'abc',那么全文檢索可以把包含'abc'的任何變化組合都查詢出來,包括大小寫、全半角,而如果用單純的SQL實現同樣的結果,則需要多次like之后union all,其性能差距是不可想象的。
全文檢索在類似文本模糊查詢上具有極大的優勢。當然也可能存在問題,即詞法分析器是否準確,會否漏掉部分內容等。
總的說來,滿足需求的技術就是好的技術,是否使用一項技術應該通過實踐來檢驗.<br>
| SQL> select subject from jivemessage where contains(subject,'abc') >0;SUBJECT -------------------------------------------------------------------------------- 【游戲】 把你的名字的首字母用智能ABC打出,看能出來什么? 游戲——把你的名字首字母用智能ABC打出來 智能ABC暗藏殺機 ABC ABC ABC ABC ABC ABC 哈哇abc abcSUBJECT -------------------------------------------------------------------------------- abc ABC 振奮愛的激情方案ABC 智能ABC的錯嗎? ABC全選 瓜果美容ABC 經典英文歌曲ABC,不好你拿版磚砍我,好就回帖頂一下! ×××abc Re: abc Re: abc Re: abcSUBJECT -------------------------------------------------------------------------------- abc 測試發貼""abc abc25 rows selected.Elapsed: 00:00:00.04 |
3.定時優化同步域索引?
創建定時任務,定期優化和同步域索引
| SQL> create or replace procedure hsp_sync_index as2 begin3 ctx_ddl.sync_index('id_cont_msg');4 end;5 /Procedure created.Elapsed: 00:00:00.08 SQL> VARIABLE jobno number; SQL> BEGIN2 DBMS_JOB.SUBMIT(:jobno,'hsp_sync_index();', 3 SYSDATE, 'SYSDATE + (1/24/4)'); 4 commit; 5 END; 6 /PL/SQL procedure successfully completed.Elapsed: 00:00:00.27 SQL> create or replace procedure hsp_optimize_index as2 begin3 ctx_ddl.optimize_index('id_cont_msg','FULL');4 end;5 /SQL> VARIABLE jobno number; SQL> BEGIN2 DBMS_JOB.SUBMIT(:jobno,'hsp_optimize_index();', 3 SYSDATE, 'SYSDATE + 1'); 4 commit; 5 END;6 / Procedure created.Elapsed: 00:00:00.03PL/SQL procedure successfully completed.Elapsed: 00:00:00.02 SQL> |
轉載于:https://blog.51cto.com/1311321/441620
總結
以上是生活随笔為你收集整理的Oracle全文检索示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WCF 第四章 绑定 绑定元素
- 下一篇: 今天感觉有点冷了其实。