不使用Oracle text功能,也有很多方法可以在Oracle數(shù)據(jù)庫中搜索文本.可以使用標(biāo)準(zhǔn)的INSTR函數(shù)和LIKE操作符實(shí)現(xiàn)。
創(chuàng)新互聯(lián)建站主要從事成都網(wǎng)站設(shè)計、成都做網(wǎng)站、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)尚志,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108
SELECT *FROM mytext WHERE INSTR (thetext, 'Oracle') 0;
SELECT * FROM mytext WHERE thetext LIKE '%Oracle%';
有很多時候,使用instr和like是很理想的, 特別是搜索僅跨越很小的表的時候.然而通過這些文本定位的方法將導(dǎo)致全表掃描,對資源來說消耗比較昂貴,而且實(shí)現(xiàn)的搜索功能也非常有限,因此對海量的文本 數(shù)據(jù)進(jìn)行搜索時,建議使用oralce提供的全文檢索功能 建立全文檢索的步驟步驟一 檢查和設(shè)置數(shù)據(jù)庫角色首先檢查數(shù)據(jù)庫中是否有CTXSYS用戶和CTXAPP腳色。如果沒有這個用戶和角色,意味著你的數(shù)據(jù)庫 創(chuàng)建時未安裝intermedia功能。你必須修改數(shù)據(jù)庫以安裝這項(xiàng)功能。 默認(rèn)安裝情況下,ctxsys用戶是被鎖定的,因此要先啟用ctxsys的用 戶。 步驟二 賦權(quán) 在ctxsys用戶下把ctx_ddl的執(zhí)行權(quán)限賦于要使用全文索引的用戶,例:
grant execute on ctx_ddl to pomoho;
步驟三 設(shè)置詞法分析器(lexer)
Oracle實(shí)現(xiàn)全文檢索,其機(jī)制其實(shí)很簡單。即通過Oracle專利的詞法分析器(lexer),將文章中所有的表意單元(Oracle 稱為 term)找出來,記錄在一組 以dr$開頭的表中,同時記下該term出現(xiàn)的位置、次數(shù)、hash 值等信息。檢索時,Oracle 從這組表中查找相應(yīng)的term,并計算其出現(xiàn)頻率,根據(jù)某個算法來計算每個文檔的得分(score),即所謂的‘匹配率’。而lexer則是該機(jī)制的核 心,它決定了全文檢索的效率。Oracle 針對不同的語言提供了不同的 lexer, 而我們通常能用到其中的三個:
n basic_lexer: 針對英語。它能根據(jù)空格和標(biāo)點(diǎn)來將英語單詞從句子中分離,還能自動將一些出現(xiàn)頻率過高已經(jīng)失去檢索意義的單詞作為‘垃圾’處理,如if , is 等,具有較高的處理效率。但該lexer應(yīng)用于漢語則有很多問題,由于它只認(rèn)空格和標(biāo)點(diǎn),而漢語的一句話中通常不會有空格,因此,它會把整句話作為一個 term,事實(shí)上失去檢索能力。以‘中國人民站起來了’這句話為例,basic_lexer 分析的結(jié)果只有一個term ,就是‘中國人民站起來了’。此時若檢索‘中國’,將檢索不到內(nèi)容。
n chinese_vgram_lexer: 專門的漢語分析器,支持所有漢字字符集(ZHS16CGB231280 ZHS16GBK ZHT32EUC ZHT16BIG5 ZHT32TRIS ZHT16MSWIN950 ZHT16HKSCS UTF8 )。該分析器按字為單元來分析漢語句子?!袊嗣裾酒饋砹恕@句話,會被它分析成如下幾個term: ‘中’,‘中國’,‘國人’,‘人民’,‘民站’,‘站起’,起來’,‘來了’,‘了’??梢钥闯?,這種分析方法,實(shí)現(xiàn)算法很簡單,并且能實(shí)現(xiàn)‘一網(wǎng)打 盡’,但效率則是差強(qiáng)人意。
n chinese_lexer: 這是一個新的漢語分析器,只支持utf8字符集。上面已經(jīng)看到,chinese vgram lexer這個分析器由于不認(rèn)識常用的漢語詞匯,因此分析的單元非常機(jī)械,像上面的‘民站’,‘站起’在漢語中根本不會單獨(dú)出現(xiàn),因此這種term是沒有 意義的,反而影響效率。chinese_lexer的最大改進(jìn)就是該分析器 能認(rèn)識大部分常用漢語詞匯,因此能更有效率地分析句子,像以上兩個愚蠢的單元將不會再出現(xiàn),極大 提高了效率。但是它只支持 utf8, 如果你的數(shù)據(jù)庫是zhs16gbk字符集,則只能使用笨笨的那個Chinese vgram lexer.
如果不做任何設(shè)置,Oracle 缺省使用basic_lexer這個分析器。要指定使用哪一個lexer, 可以這樣操作:
第一. 當(dāng)前用戶下下建立一個preference(例:在pomoho用戶下執(zhí)行以下語句)
exec ctx_ddl.create_preference ('my_lexer', 'chinese_vgram_lexer');
第二. 在建立全文索引索引時,指明所用的lexer:
CREATE INDEX myindex ON mytable(mycolumn) indextype is ctxsys.context
parameters('lexer my_lexer');
這樣建立的全文檢索索引,就會使用chinese_vgram_lexer作為分析器。
步驟四 建立索引
通過以下語法建立全文索引
CREATE INDEX [schema.]index on [schema.]table(column) INDEXTYPE IS ctxsys.context [ONLINE]
LOCAL [(PARTITION [partition] [PARAMETERS('paramstring')]
[, PARTITION [partition] [PARAMETERS('paramstring')]])]
[PARAMETERS(paramstring)] [PARALLEL n] [UNUSABLE];
例:
CREATE INDEX ctx_idx_menuname ON pubmenu(menuname)
indextype is ctxsys.context parameters('lexer my_lexer')
步驟五 使用索引
使用全文索引很簡單,可以通過:
select * from pubmenu where contains(menuname,'上傳圖片')0
全文索引的種類
建立的Oracle Text索引被稱為域索引(domain index),包括4種索引類型:
l CONTEXT
2 CTXCAT
3 CTXRULE
4 CTXXPATH
依據(jù)你的應(yīng)用程序和文本數(shù)據(jù)類型你可以任意選擇一種。
對多字段建立全文索引
很多時候需要從多個文本字段中查詢滿足條件的記錄,這時就需要建立針對多個字段的全文索引,例如需要從pmhsubjects(專題表)的 subjectname(專題名稱)和briefintro(簡介)上進(jìn)行全文檢索,則需要按以下步驟進(jìn)行操作:
? 建議多字段索引的preference
以ctxsys登錄,并執(zhí)行:
EXEC ctx_ddl.create_preference(' ctx_idx_subject_pref',
'MULTI_COLUMN_DATASTORE');
? 建立preference對應(yīng)的字段值(以ctxsys登錄)
EXEC ctx_ddl.set_attribute(' ctx_idx_subject_pref ','columns','subjectname,briefintro');
? 建立全文索引
CREATE INDEX ctx_idx_subject ON pmhsubjects(subjectname)
INDEXTYPE ISctxsys.CONTEXT PARAMETERS('DATASTORE ctxsys.ctx_idx_subject_pref lexer my_lexer')
? 使用索引
select * from pmhsubjects where contains(subjectname,'李宇春')0
全文索引的維護(hù)
對于CTXSYS.CONTEXT索引,當(dāng)應(yīng)用程序?qū)磉M(jìn)行DML操作后,對基表的索引維護(hù)是必須的。索引維護(hù)包括索引同步和索引優(yōu)化。
在索引建好后,我們可以在該用戶下查到Oracle自動產(chǎn)生了以下幾個表:(假設(shè)索引名為myindex):
DR$myindex$I、DR$myindex$K、DR$myindex$R、DR$myindex$N其中以I表最重要,可以查詢一下該表, 看看有什么內(nèi)容:
SELECT token_text, token_count FROM dr$i_rsk1$I WHERE ROWNUM = 20;
這里就不列出查詢接過了??梢钥吹?,該表中保存的其實(shí)就是Oracle 分析你的文檔后,生成的term記錄在這里,包括term出現(xiàn)的位置、次數(shù)、hash值等。當(dāng)文檔的內(nèi)容改變后,可以想見這個I表的內(nèi)容也應(yīng)該相應(yīng)改變, 才能保證Oracle在做全文檢索時正確檢索到內(nèi)容(因?yàn)樗^全文檢索,其實(shí)核心就是查詢這個表)。這就用到sync(同步) 和 optimize(優(yōu)化)了。
同步(sync): 將新的term 保存到I表;
優(yōu)化(optimize): 清除I表的垃圾,主要是將已經(jīng)被刪除的term從I表刪除。
當(dāng)基表中的被索引文檔發(fā)生insert、update、delete操作的時候,基表的改變并不能馬上影響到索引上直到同步索引??梢圆樵円晥D CTX_USER_PENDING查看相應(yīng)的改動。例如:
SELECT pnd_index_name, pnd_rowid,
TO_CHAR (pnd_timestamp, 'dd-mon-yyyy hh24:mi:ss') timestamp
FROM ctx_user_pending;
該語句的輸出類似如下:
PND_INDEX_NAME PND_ROWID TIMESTAMP
------------------------------ ------------------ --------------------
MYINDEX AAADXnAABAAAS3SAAC 06-oct-1999 15:56:50
同步和優(yōu)化方法: 可以使用Oracle提供的ctx_ddl包同步和優(yōu)化索引
一. 對于CTXCAT類型的索引來說, 當(dāng)對基表進(jìn)行DML操作的時候,Oracle自動維護(hù)索引。對文檔的改變馬上反映到索引中。CTXCAT是事務(wù)形的索引。
索引的同步
在對基表插入,修改,刪除之后同步索引。推薦使用sync同步索引。語法:
ctx_ddl.sync_index(
idx_name IN VARCHAR2 DEFAULT NULL
memory IN VARCHAR2 DEFAULT NULL,
part_name IN VARCHAR2 DEFAULT NULL
parallel_degree IN NUMBER DEFAULT 1);
idx_name 索引名稱
memory 指定同步索引需要的內(nèi)存。默認(rèn)是系統(tǒng)參數(shù)DEFAULT_INDEX_MEMORY 。
指定一個大的內(nèi)存時候可以加快索引效率和查詢速度,且索引有較少的碎片
part_name 同步哪個分區(qū)索引。
parallel_degree 并行同步索引。設(shè)置并行度。
例如:
同步索引myindex:Exec ctx_ddl.sync_index ('myindex');
實(shí)施建議:建議通過oracle的job對索引進(jìn)行同步
索引的優(yōu)化
經(jīng)常的索引同步將會導(dǎo)致你的CONTEXT索引產(chǎn)生碎片。索引碎片嚴(yán)重的影響了查詢的反應(yīng)速度。你可以定期優(yōu)化索引來減少碎片,減少索引大小,提高 查詢效率。
當(dāng)文本從表中刪除的時候,Oracle Text標(biāo)記刪除的文檔,但是并不馬上修改索引。因此,就的文檔信息占據(jù)了不必要的空間,導(dǎo)致了查詢額外的開銷。你必須以FULL模式優(yōu)化索引,從索引中 刪除無效的舊的信息。這個過程叫做垃圾處理。當(dāng)你經(jīng)常的對表文本數(shù)據(jù)進(jìn)行更新,刪除操作的時候,垃圾處理是很必要的。
exec ctx_ddl.optimize_index ('myidx', 'full');
實(shí)施建議:每天在系統(tǒng)空閑的時候?qū)θ?文索引進(jìn)行相應(yīng)的優(yōu)化,以提高檢索的效率
有以下幾個方法,供您參考。
1、對于提交(最后一次操作commit了)的話可以查詢那個提交段SELECT
列名1,列名2??FROM 表名 VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE where VERSIONS_STARTTIME IS NOT null ORDER BY VERSIONS_STARTTIME DESC;查出來的第一條就是最后改變的數(shù)據(jù)
2、如果表里面有序列或固定的排序字段可按倒排序后取第一條where rownum2 order by 排序字段 desc
3、還有另外一種辦法就是利用ORACLE偽列rowid
select * from tbl t1 where t1.rowid=(select max(rowid) from tbl t2)
4、在redo log中找到對應(yīng)相關(guān)的表的插入語句,但是這樣找到的是sql語句,而不是數(shù)據(jù)。查redo log得使用log miner工具。
這是幾項(xiàng)常用的方法,希望我的回答能給您帶來幫助。
Oracle Database,又名Oracle RDBMS,或簡稱Oracle。是甲骨文公司的一款關(guān)系數(shù)據(jù)庫管理系統(tǒng)。
在Oracle i Rlease 中 Oracle的全文檢索技術(shù)被稱為:Oracle Text 功能十分強(qiáng)大 Oracle Text是Oracle i采用的新名稱 在Oracle / i中它被稱作Oracle interMedia Text 在Oracle 以前它的名稱是Oracle ConText Cartridge Oracle Text組件可以在安裝數(shù)據(jù)庫的時候選擇 缺省是安裝的 如果沒有安裝 那么可以按照以下方式手動安裝Oracle Text 創(chuàng)建存儲表空間
$ sqlplus / as sysdba SQL*Plus: Release Production on Sun May : : Copyright (c) Oracle Corporation All rights reserved Connected to: Oracle i Enterprise Edition Release bit Production With the Partitioning OLAP and Oracle Data Mining options JServer Release Production SQL select name from v$datafile; NAME /h love/oracle/system dbf /h love/oracle/undotbs dbf /h love/oracle/users dbf rows selected SQL create tablespace oratext datafile /h love/oracle/oratext dbf size m extent management local uniform size k ; Tablespace created
創(chuàng)建相關(guān)對象
SQL spool text log SQL connect sys/oracleHURRAY as sysdba Connected SQL start ?/ctx/admin/dr csys password oratext temp creating user CTXSYS creating role CTXAPP SQL connect ctxsys/password Connected SQL start ?/ctx/admin/dr inst ?/ctx/lib/libctxx so ============== ConText Database Objects Installation ============== This script must be run as CTXSYS This script will exit below if run as any other user User is CTXSYS creating tables and Oracle object types creating table dr$parameter creating table dr$class creating table dr$object creating table dr$object_attribute creating table dr$object_attribute_lov creating table dr$preference creating table dr$preference_value creating table dr$index creating table dr$index_partition creating table dr$index_value creating table dr$policy_tab creating table dr$sqe creating table dr$ths creating table dr$ths_phrase creating table dr$ths_fphrase creating table dr$ths_bt creating table dr$section_group creating table dr$section creating table dr$stoplist creating table dr$stopword creating table dr$sub_lexer creating table dr$index_set creating table dr$index_set_index creating table dr$server creating table dr$pending creating table dr$waiting creating table dr$online_pending creating table dr$delete creating table dr$unindexed creating table dr$index_error creating table dr$parallel creating table dr$stats creating table dr$part_stats creating named data type ctx_feedback_item_type creating named data type ctx_feedback_type creating safe callout library creating CONTEXT interface drop public synonym contains * ERROR at line : ORA : public synonym to be dropped does not exist drop public synonym score * ERROR at line : ORA : public synonym to be dropped does not exist creating CTXCAT interface drop public synonym catsearch * ERROR at line : ORA : public synonym to be dropped does not exist creating CTXRULE interface drop public synonym matches * ERROR at line : ORA : public synonym to be dropped does not exist creating CTXXPATH interface loading package headers ================== Package Installation ========================== Install Global Symbols loading driobj pkh No errors loading dr def pkh No errors loading drig pkh No errors Install DR Internal package specs loading driutl pkh No errors loading driacc pkh No errors loading driadm pkh No errors loading dricon pkh No errors loading dridisp pkh No errors loading dridml pkh No errors loading dridoc pkh No errors loading drierr pkh No errors loading driddl pkh No errors loading driddlp pkh No errors loading driddlc pkh No errors loading driddlr pkh No errors loading driddlx pkh No errors loading drilist pkh No errors loading driload pkh No errors loading driopt pkh No errors loading dripipe pkh No errors loading dripref pkh No errors loading drirec pkh No errors loading drirep pkh No errors loading drirepm pkh No errors loading drireps pkh No errors loading drirept pkh No errors loading drirepz pkh No errors loading driths pkh No errors loading drithsc pkh No errors loading drithsd pkh No errors loading drithsl pkh No errors loading drithsx pkh No errors loading drival pkh No errors loading driexp pkh No errors loading driimp pkh No errors loading driparse pkh No errors loading drixtab pkh No errors loading drixtabc pkh No errors loading drixtabr pkh No errors loading drixtabx pkh No errors Install ConText public API specs loading dr adm pkh No errors loading dr ddl pkh No errors loading dr doc pkh No errors loading dr out pkh No errors loading dr query pkh No errors loading dr thes pkh No errors loading dr repor pkh No errors loading dr ulex pkh No errors loading dr cls pkh No errors loading package bodies ================== Package Installation ========================== Install DR Internal package bodies loading driacc plb No errors loading driadm plb No errors loading dricon plb No errors loading dridisp plb No errors loading dridml plb No errors loading dridoc plb No errors loading drierr plb No errors loading driddl plb No errors loading driddlp plb No errors loading driddlc plb No errors loading driddlr plb No errors loading driddlx plb No errors loading drilist plb No errors loading driload plb No errors loading dripipe plb No errors loading driopt plb No errors loading dripref plb No errors loading drirec plb No errors loading drirep plb No errors loading drirepm plb No errors loading drireps plb No errors loading drirept plb No errors loading drirepz plb No errors loading driths plb No errors loading drithsc plb No errors loading drithsd plb No errors loading drithsl plb No errors loading drithsx plb No errors loading driutl plb No errors loading drival plb No errors loading driexp plb No errors loading driimp plb No errors loading driparse plb No errors loading drixtab plb No errors loading drixtabc plb No errors loading drixtabr plb No errors loading drixtabx plb No errors loading driproc plb No errors Install ConText public API bodies loading dr adm plb No errors loading dr ddl plb No errors loading dr doc plb No errors loading dr out plb No errors loading dr query plb No errors loading dr thes plb No errors loading dr repor plb No errors loading dr cls plb No errors ======================================================== creating CONTEXT interface body No errors No errors creating CTXCAT interface body No errors creating CTXRULE interface body No errors creating CTXXPATH interface body No errors creating CONTEXT index type drop public synonym context * ERROR at line : ORA : public synonym to be dropped does not exist creating CTXCAT index type drop public synonym ctxcat * ERROR at line : ORA : public synonym to be dropped does not exist creating CTXRULE index type drop public synonym ctxrule * ERROR at line : ORA : public synonym to be dropped does not exist creating CTXXPATH index type drop public synonym ctxxpath * ERROR at line : ORA : public synonym to be dropped does not exist creating objects Removing old object definitions Creating new object definitions creating default preferences Create default preferences System Parameters ======================================================== SQL start ?/ctx/admin/defaults/drdefus sql; Creating lexer preference Creating wordlist preference Creating stoplist Creating default policy SQL spool off SQL exit Disconnected from Oracle i Enterprise Edition Release bit Production With the Partitioning OLAP and Oracle Data Mining options JServer Release Production
請注意如果漏掉drdefus sql腳本 使用過程中將會出現(xiàn)以下類似錯誤
ERROR atline : ORA : error occurred in the execution of ODCIINDEXCREATEroutine ORA : interMedia Text error: DRG : preference does notexist: CTXSYS DEFAULT_LEXER ORA : at CTXSYS DRUE line ORA :at CTXSYS TEXTINDEXMETHODS line ORA : at line
lishixinzhi/Article/program/Oracle/201311/17795
同時查詢2張表數(shù)據(jù)有很多種方法(下面的a,b為表名,A,B為表的別名):
1,select A.*,B.* from a A,b B;
這樣查出來的是a的所有數(shù)據(jù)在前面幾列,b的數(shù)據(jù)在后面幾列。
2,select * from a cross join a
這樣查出來的數(shù)據(jù)是2張表的笛卡爾積。
即a的數(shù)據(jù)量乘以b的數(shù)據(jù)量的積
3,如果兩張表擁有相同的字段,你可以使用left join或者right join
select * from table1 left join table2 on table1.id=table2.id
對多字段建立全文索引
很多時候需要從多個文本字段中查詢滿足條件的記錄,這時就需要建立針對多個字段的全文索引,例如需要從pmhsubjects(專題表)的subjectname(專題名稱)和briefintro(簡介)上進(jìn)行全文檢索,則需要按以下步驟進(jìn)行操作:
??
建議多字段索引的preference
以ctxsys登錄,并執(zhí)行:
全文索引的維護(hù)
對于CTXSYS.CONTEXT索引,當(dāng)應(yīng)用程序?qū)磉M(jìn)行DML操作后,對基表的索引維護(hù)是必須的。索引維護(hù)包括索引同步和索引優(yōu)化。
在索引建好后,我們可以在該用戶下查到Oracle自動產(chǎn)生了以下幾個表:(假設(shè)索引名為myindex):
DR$myindex$I、DR$myindex$K、DR$myindex$R、DR$myindex$N其中以I表最重要,可以查詢一下該表,看看有什么內(nèi)容:
這里就不列出查詢接過了。可以看到,該表中保存的其實(shí)就是Oracle
分析你的文檔后,生成的term記錄在這里,包括term出現(xiàn)的位置、次數(shù)、hash值等。當(dāng)文檔的內(nèi)容改變后,可以想見這個I表的內(nèi)容也應(yīng)該相應(yīng)改變,才能保證Oracle在做全文檢索時正確檢索到內(nèi)容(因?yàn)樗^全文檢索,其實(shí)核心就是查詢這個表)。這就用到sync(同步)
和
optimize(優(yōu)化)了。
同步(sync):
將新的term
保存到I表;
優(yōu)化(optimize):
清除I表的垃圾,主要是將已經(jīng)被刪除的term從I表刪除。
當(dāng)基表中的被索引文檔發(fā)生insert、update、delete操作的時候,基表的改變并不能馬上影響到索引上直到同步索引??梢圆樵円晥DCTX_USER_PENDING查看相應(yīng)的改動。例如:
同步和優(yōu)化方法:
可以使用Oracle提供的ctx_ddl包同步和優(yōu)化索引
一.
對于CTXCAT類型的索引來說,
當(dāng)對基表進(jìn)行DML操作的時候,Oracle自動維護(hù)索引。對文檔的改變馬上反映到索引中。CTXCAT是事務(wù)形的索引。
索引的同步
在對基表插入,修改,刪除之后同步索引。推薦使用sync同步索引。語法:
指定一個大的內(nèi)存時候可以加快索引效率和查詢速度,且索引有較少的碎片
part_name
同步哪個分區(qū)索引。
parallel_degree
并行同步索引。設(shè)置并行度。
例如:
同步索引myindex:Exec
ctx_ddl.sync_index
('myindex');
實(shí)施建議:建議通過oracle的job對索引進(jìn)行同步
索引的優(yōu)化
經(jīng)常的索引同步將會導(dǎo)致你的CONTEXT索引產(chǎn)生碎片。索引碎片嚴(yán)重的影響了查詢的反應(yīng)速度。你可以定期優(yōu)化索引來減少碎片,減少索引大小,提高查詢效率。