對(duì)多字段建立全文索引 很多時(shí)候需要從多個(gè)文本字段中查詢滿足條件的記錄,這時(shí)就需要建立針對(duì)多個(gè)字段的全文索引,例如需要從pmhsubjects(專題表)的subjectname(專題名稱)和briefintro(簡(jiǎn)介)上進(jìn)行全文檢索,則需要按以下步驟進(jìn)行操作: ?? 建議多字段索引的preference 以ctxsys登錄,并執(zhí)行: 全文索引的維護(hù) 對(duì)于CTXSYS.CONTEXT索引,當(dāng)應(yīng)用程序?qū)磉M(jìn)行DML操作后,對(duì)基表的索引維護(hù)是必須的。索引維護(hù)包括索引同步和索引優(yōu)化。 在索引建好后,我們可以在該用戶下查到Oracle自動(dòng)產(chǎn)生了以下幾個(gè)表:(假設(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)容改變后,可以想見這個(gè)I表的內(nèi)容也應(yīng)該相應(yīng)改變,才能保證Oracle在做全文檢索時(shí)正確檢索到內(nèi)容(因?yàn)樗^全文檢索,其實(shí)核心就是查詢這個(gè)表)。這就用到sync(同步) 和 optimize(優(yōu)化)了。 同步(sync): 將新的term 保存到I表; 優(yōu)化(optimize): 清除I表的垃圾,主要是將已經(jīng)被刪除的term從I表刪除。 當(dāng)基表中的被索引文檔發(fā)生insert、update、delete操作的時(shí)候,基表的改變并不能馬上影響到索引上直到同步索引。可以查詢視圖CTX_USER_PENDING查看相應(yīng)的改動(dòng)。例如: 同步和優(yōu)化方法: 可以使用Oracle提供的ctx_ddl包同步和優(yōu)化索引 一. 對(duì)于CTXCAT類型的索引來說, 當(dāng)對(duì)基表進(jìn)行DML操作的時(shí)候,Oracle自動(dòng)維護(hù)索引。對(duì)文檔的改變馬上反映到索引中。CTXCAT是事務(wù)形的索引。 索引的同步 在對(duì)基表插入,修改,刪除之后同步索引。推薦使用sync同步索引。語(yǔ)法: 指定一個(gè)大的內(nèi)存時(shí)候可以加快索引效率和查詢速度,且索引有較少的碎片 part_name 同步哪個(gè)分區(qū)索引。 parallel_degree 并行同步索引。設(shè)置并行度。 例如: 同步索引myindex:Exec ctx_ddl.sync_index ('myindex'); 實(shí)施建議:建議通過oracle的job對(duì)索引進(jìn)行同步 索引的優(yōu)化 經(jīng)常的索引同步將會(huì)導(dǎo)致你的CONTEXT索引產(chǎn)生碎片。索引碎片嚴(yán)重的影響了查詢的反應(yīng)速度。你可以定期優(yōu)化索引來減少碎片,減少索引大小,提高查詢效率。
我們提供的服務(wù)有:網(wǎng)站制作、做網(wǎng)站、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、南城ssl等。為上千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的南城網(wǎng)站制作公司
當(dāng)文本從表中刪除的時(shí)候,Oracle Text標(biāo)記刪除的文檔,但是并不馬上修改索引。因此,就的文檔信息占據(jù)了不必要的空間,導(dǎo)致了查詢額外的開銷。你必須以FULL模式優(yōu)化索引,從索引中刪除無效的舊的信息。這個(gè)過程叫做垃圾處理。當(dāng)你經(jīng)常的對(duì)表文本數(shù)據(jù)進(jìn)行更新,刪除操作的時(shí)候,垃圾處理是很必要的。
一 查看索引名select * from user_indexes;二 刪除索引drop index index_name;
Oracle全文檢索配置方法:
1.檢查數(shù)據(jù)庫(kù)是否具有全文檢索功能(這是針對(duì)已經(jīng)建成使用的數(shù)據(jù)庫(kù))
查看用戶中是否存在ctxsys用戶,查詢角色里是否存在ctxapp角色。以上兩個(gè)中的1個(gè)不滿足(不存在),則說明沒有裝過全文檢索功能。
使用contains函數(shù)的時(shí)候,若沒有全文檢索則會(huì)報(bào)錯(cuò)的。
2.若沒有,則需要手動(dòng)建立,先建立全文檢索要使用的空間
sqlplus / as sysdba ?--進(jìn)入控制臺(tái)
create?tablespace?Idx_ctxsys?datafile?'/oradata/sg186fx/ctxsys01.dbf?size?10240M?autoextend?on?next?32M?maxsize?20480M;--創(chuàng)建全文檢索使用的表空間
3.創(chuàng)建全文檢索使用的用戶和角色及相應(yīng)的包,則需要執(zhí)行oracle自帶的一個(gè)腳本:cd $ORACLE_HOME/ctx/admin/catctx.sql
還是在sqlplus中執(zhí)行:
@?/ctx/admin/catctx.sql ctxsys Idx_ctxsys temp nolock
在執(zhí)行這個(gè)腳本的時(shí)候,輸入了幾個(gè)參數(shù),第一個(gè)參數(shù)ctxsys為ctxsys用戶的密碼
第二個(gè)參數(shù)Idx_ctxsys為ctxsys用戶要使用的表空間
第三個(gè)參數(shù)temp為ctxsys用戶使用的臨時(shí)表空間
第四個(gè)參數(shù)nolock為ctxsys用戶處于解鎖狀態(tài)。
4.創(chuàng)建完成后,要登錄ctxsys用戶
connect ctxsys/ctxsys
執(zhí)行以下腳本:@?/ctx/admin/defaults/drdefus.sql(這是個(gè)很重要的腳本,后面創(chuàng)建索引會(huì)使用該腳本創(chuàng)建的信息)
5.創(chuàng)建全文索引語(yǔ)法分析器
先要明確使用全文索引的用戶,我要使用全文索引的是sgpm用戶
因此
grant?execute?on?ctxsys.ctx_ddl?to?sgpm?with?grant?option;
connect sgpm/sgpm
設(shè)置語(yǔ)法分析器:
exec?ctx_ddl.drop_preference('chinalexer');
exec?ctx_ddl.create_preference('chinalexer','chinese_lexer');
設(shè)置詞法屬性:
exec?ctx_ddl.drop_preference('idx_c_store');
begin
ctx_ddl.create_preference('idx_c_store','BASIC_STORAGE');
ctx_ddl.set_attribut('idx_c_store','I_TABLE_CLAUSE','tablespaces??Idx_ctxsy');
ctx_ddl.set_attribute('idx_c_store','I_INDEX_CLAUSE','tablespace??Idx_ctxsy?compress?2');
end;
/
6.創(chuàng)建索引
create?index?sgpm.idx_c_cons_name?on?sgpm.c_cons(cons_name)?indextype?is?ctxsys.context?parameters('lexer?chinalexer?storage?idx_c_store');
7.同步索引
variable?jobno?number;
begin
dbms_job.submit(:jobno,'pkg_sp_tools.p_cont_sys_index();',sysdate,'trunc(sysdate)+19/24+1');??--執(zhí)行的是個(gè)性化方法。
end;
/
普通的就是用:
exec?ctx_ddl.sync_index('idx_c_cons_name');
到此,全文檢索創(chuàng)建成功,contains函數(shù)就可以正常使用了。
注意:創(chuàng)建的過程中會(huì)出現(xiàn)ORA-29879:cannot create multiple domain index on a column listusing same indextype ,這說明在其他用戶下已經(jīng)建立了該索引。
全文檢索是一種將文件中所有文本與檢索項(xiàng)匹配的文字資料檢索方法。全文檢索系統(tǒng)是按照全文檢索理論建立起來的用于提供全文檢索服務(wù)的軟件系統(tǒng)。
判斷檢索效果的兩個(gè)指標(biāo):
查全率=被檢出相關(guān)信息量/相關(guān)信息總量(%)
查準(zhǔn)率=被檢出相關(guān)信息量/被檢出信息總量(%)
Oracle全文檢索配置方法:
1.檢查數(shù)據(jù)庫(kù)是否具有全文檢索功能(這是針對(duì)已經(jīng)建成使用的數(shù)據(jù)庫(kù))
查看用戶中是否存在ctxsys用戶,查詢角色里是否存在ctxapp角色。以上兩個(gè)中的1個(gè)不滿足(不存在),則說明沒有裝過全文檢索功能。
使用contains函數(shù)的時(shí)候,若沒有全文檢索則會(huì)報(bào)錯(cuò)的。
2.若沒有,則需要手動(dòng)建立,先建立全文檢索要使用的空間
sqlplus / as sysdba ?--進(jìn)入控制臺(tái)
create?tablespace?Idx_ctxsys?datafile?'/oradata/sg186fx/ctxsys01.dbf?size?10240M?autoextend?on?next?32M?maxsize?20480M;--創(chuàng)建全文檢索使用的表空間
3.創(chuàng)建全文檢索使用的用戶和角色及相應(yīng)的包,則需要執(zhí)行oracle自帶的一個(gè)腳本:cd $ORACLE_HOME/ctx/admin/catctx.sql
還是在sqlplus中執(zhí)行:
@?/ctx/admin/catctx.sql ctxsys Idx_ctxsys temp nolock
在執(zhí)行這個(gè)腳本的時(shí)候,輸入了幾個(gè)參數(shù),第一個(gè)參數(shù)ctxsys為ctxsys用戶的密碼
第二個(gè)參數(shù)Idx_ctxsys為ctxsys用戶要使用的表空間
第三個(gè)參數(shù)temp為ctxsys用戶使用的臨時(shí)表空間
第四個(gè)參數(shù)nolock為ctxsys用戶處于解鎖狀態(tài)。
4.創(chuàng)建完成后,要登錄ctxsys用戶
connect ctxsys/ctxsys
執(zhí)行以下腳本:@?/ctx/admin/defaults/drdefus.sql(這是個(gè)很重要的腳本,后面創(chuàng)建索引會(huì)使用該腳本創(chuàng)建的信息)
5.創(chuàng)建全文索引語(yǔ)法分析器
先要明確使用全文索引的用戶,我要使用全文索引的是sgpm用戶
因此
grant?execute?on?ctxsys.ctx_ddl?to?sgpm?with?grant?option;
connect sgpm/sgpm
設(shè)置語(yǔ)法分析器:
exec?ctx_ddl.drop_preference('chinalexer');
exec?ctx_ddl.create_preference('chinalexer','chinese_lexer');
設(shè)置詞法屬性:exec?ctx_ddl.drop_preference('idx_c_store');
begin
ctx_ddl.create_preference('idx_c_store','BASIC_STORAGE');
ctx_ddl.set_attribut('idx_c_store','I_TABLE_CLAUSE','tablespaces??Idx_ctxsy');
ctx_ddl.set_attribute('idx_c_store','I_INDEX_CLAUSE','tablespace??Idx_ctxsy?compress?2');
end;
/
6.創(chuàng)建索引
create?index?sgpm.idx_c_cons_name?on?sgpm.c_cons(cons_name)?indextype?is?ctxsys.context?parameters('lexer?chinalexer?storage?idx_c_store');
7.同步索引
variable?jobno?number;
begin
dbms_job.submit(:jobno,'pkg_sp_tools.p_cont_sys_index();',sysdate,'trunc(sysdate)+19/24+1');??--執(zhí)行的是個(gè)性化方法。
end;
/
普通的就是用:
exec?ctx_ddl.sync_index('idx_c_cons_name');
到此,全文檢索創(chuàng)建成功,contains函數(shù)就可以正常使用了。
注意:創(chuàng)建的過程中會(huì)出現(xiàn)ORA-29879:cannot create multiple domain index on a column listusing same indextype ,這說明在其他用戶下已經(jīng)建立了該索引。
create
index創(chuàng)建的索引是為了提高查詢速度,
你用的contains是Oracle的信息檢索功能,需要指定一個(gè)包含有效context索引的列,
如果select子句中有l(wèi)abel的話,最后還需要一個(gè)比較操作符才能完成查詢,
你可以找一些關(guān)于Oracle
Text索引的資料看看
oracle可以支持多個(gè)字段上的全文索引,但如果還涉及到多張表的話,就只能在每張表上建一個(gè)全文索引。但這樣的話,查詢時(shí)很不方便。而且如果涉及到的表或者字段發(fā)生變化,需要重新建全文索引,可擴(kuò)展性不佳。
另一個(gè)思路是專門建立一張中間表,其中包括以下字段:表名,字段名,字段值,對(duì)象ID。在字段值這個(gè)字段上建立全文索引。然后定時(shí)的將原來四張表中須檢索的字段同步到此中間表(可考慮用物化視圖)。查詢時(shí),直接對(duì)此中間表進(jìn)行查詢即可。
舉個(gè)例子:假設(shè)原表是文章表,其中有如下一條數(shù)據(jù):
ID
標(biāo)題
內(nèi)容
作者
1
德川家康為什么能統(tǒng)一日本?
請(qǐng)教一下,為什么最后是德川家康統(tǒng)一日本呢?
德川家康粉
現(xiàn)在需要檢索在標(biāo)題,內(nèi)容或作者字段中存在“德川家康”的數(shù)據(jù)。
首先,需要將原數(shù)據(jù)同步到中間表,變成以下三條數(shù)據(jù):
表名
字段名
字段值
對(duì)象ID
文章表
標(biāo)題
德川家康為什么能統(tǒng)一日本?
1
文章表
內(nèi)容
請(qǐng)教一下,為什么最后是德川家康統(tǒng)一日本呢?
1
文章表
作者
德川家康粉
1
通過在字段值這個(gè)字段上全文檢索“德川家康”,可以篩選出以上三條數(shù)據(jù)。這三條數(shù)據(jù)都指向文章表中的ID=1的文章。從文章表里取出這條數(shù)據(jù),檢索就成功結(jié)束了。
此方法的優(yōu)點(diǎn):一是檢索的速度比較快;二是可以兼容指定表或指定字段的檢索;三是需要檢索的表或字段可以動(dòng)態(tài)刪減,可擴(kuò)展性好。
主要的缺點(diǎn)一是需要一張中間表,并定時(shí)同步,消耗額外的服務(wù)器資源,二是同步的過程會(huì)造成延時(shí),即新修改但尚未同步的數(shù)據(jù)會(huì)暫時(shí)檢索不到。
分享題目:oracle如何全文索引 oracle索引的使用
文章網(wǎng)址:http://chinadenli.net/article20/hpieco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站設(shè)計(jì)、網(wǎng)站收錄、外貿(mào)網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)