欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Oracle 如何創(chuàng)建和使用全文索引

 更新時(shí)間:2016年05月25日 10:51:42   作者:xudec  
Oracle實(shí)現(xiàn)全文檢索,其機(jī)制其實(shí)很簡(jiǎn)單。即通過Oracle專利的詞法分析器(lexer),將文章中所有的表意單元(Oracle 稱為 term)找出來,記錄在一組 以dr$開頭的表中,同時(shí)記下該term出現(xiàn)的位置、次數(shù)、hash 值等信息。

不使用Oracle text功能,也有很多方法可以在Oracle數(shù)據(jù)庫(kù)中搜索文本.可以使用標(biāo)準(zhǔn)的INSTR函數(shù)和LIKE操作符實(shí)現(xiàn)。

SELECT *FROM mytext WHERE INSTR (thetext, 'Oracle') > 0;

SELECT * FROM mytext WHERE thetext LIKE '%Oracle%';

  有很多時(shí)候,使用instr和like是很理想的, 特別是搜索僅跨越很小的表的時(shí)候.然而通過這些文本定位的方法將導(dǎo)致全表掃描,對(duì)資源來說消耗比較昂貴,而且實(shí)現(xiàn)的搜索功能也非常有限,因此對(duì)海量的文本數(shù)據(jù)進(jìn)行搜索時(shí),建議使用oralce提供的全文檢索功能 建立全文檢索的步驟步驟一 檢查和設(shè)置數(shù)據(jù)庫(kù)角色首先檢查數(shù)據(jù)庫(kù)中是否有CTXSYS用戶和CTXAPP腳色。如果沒有這個(gè)用戶和角色,意味著你的數(shù)據(jù)庫(kù)創(chuàng)建時(shí)未安裝intermedia功能。你必須修改數(shù)據(jù)庫(kù)以安裝這項(xiàng)功能。 默認(rèn)安裝情況下,ctxsys用戶是被鎖定的,因此要先啟用ctxsys的用戶。 步驟二 賦權(quán) 在ctxsys用戶下把ctx_ddl的執(zhí)行權(quán)限賦于要使用全文索引的用戶,例:

grant execute on ctx_ddl to pomoho;

一、設(shè)置詞法分析器

  Oracle實(shí)現(xiàn)全文檢索,其機(jī)制其實(shí)很簡(jiǎn)單。即通過Oracle專利的詞法分析器(lexer),將文章中所有的表意單元(Oracle稱為term)找出來,記錄在一組以dr$開頭的表中,同時(shí)記下該term出現(xiàn)的位置、次數(shù)、hash值等信息。檢索時(shí),Oracle從這組表中查找相應(yīng)的term,并計(jì)算其出現(xiàn)頻率,根據(jù)某個(gè)算法來計(jì)算每個(gè)文檔的得分(score),即所謂的‘匹配率'。而lexer則是該機(jī)制的核心,它決定了全文檢索的效率。Oracle針對(duì)不同的語(yǔ)言提供了不同的lexer,而我們通常能用到其中的三個(gè):

  basic_lexer:針對(duì)英語(yǔ)。它能根據(jù)空格和標(biāo)點(diǎn)來將英語(yǔ)單詞從句子中分離,還能自動(dòng)將一些出現(xiàn)頻率過高已經(jīng)失去檢索意義的單詞作為‘垃圾'處理,如if , is等,具有較高的處理效率。但該lexer應(yīng)用于漢語(yǔ)則有很多問題,由于它只認(rèn)空格和標(biāo)點(diǎn),而漢語(yǔ)的一句話中通常不會(huì)有空格,因此,它會(huì)把整句話作為一個(gè)term,事實(shí)上失去檢索能力。以‘中國(guó)人民站起來了'這句話為例,basic_lexer分析的結(jié)果只有一個(gè)term ,就是‘中國(guó)人民站起來了'。此時(shí)若檢索‘中國(guó)',將檢索不到內(nèi)容。

  chinese_vgram_lexer:專門的漢語(yǔ)分析器,支持所有漢字字符集(ZHS16CGB231280ZHS16GBKZHT32EUCZHT16BIG5ZHT32TRISZHT16MSWIN950ZHT16HKSCSUTF8)。該分析器按字為單元來分析漢語(yǔ)句子。‘中國(guó)人民站起來了'這句話,會(huì)被它分析成如下幾個(gè)term: ‘中',‘中國(guó)',‘國(guó)人',‘人民',‘民站',‘站起',起來',‘來了',‘了'??梢钥闯?,這種分析方法,實(shí)現(xiàn)算法很簡(jiǎn)單,并且能實(shí)現(xiàn)‘一網(wǎng)打盡',但效率則是差強(qiáng)人意。

  chinese_lexer:這是一個(gè)新的漢語(yǔ)分析器,只支持utf8字符集。上面已經(jīng)看到,chinese vgram lexer這個(gè)分析器由于不認(rèn)識(shí)常用的漢語(yǔ)詞匯,因此分析的單元非常機(jī)械,像上面的‘民站',‘站起'在漢語(yǔ)中根本不會(huì)單獨(dú)出現(xiàn),因此這種term是沒有意義的,反而影響效率。chinese_lexer的最大改進(jìn)就是該分析器能認(rèn)識(shí)大部分常用漢語(yǔ)詞匯,因此能更有效率地分析句子,像以上兩個(gè)愚蠢的單元將不會(huì)再出現(xiàn),極大提高了效率。但是它只支持utf8,如果你的數(shù)據(jù)庫(kù)是zhs16gbk字符集,則只能使用笨笨的那個(gè)Chinese vgram lexer.
如果不做任何設(shè)置,Oracle缺省使用basic_lexer這個(gè)分析器。要指定使用哪一個(gè)lexer,可以這樣操作:

BEGIN
 ctx_ddl.create_preference ('my_lexer', 'chinese_vgram_lexer');
END;
/

其中my_lexer是分析器名。

二、建立全文索引

在建立intermedia索引時(shí),指明所用的lexer:

CREATE INDEX  myindex ON mytable(mycolumn) indextype is ctxsys.context parameters('lexer my_lexer');

※個(gè)人體會(huì):全文索引建立后,用pl/sql developer工具view table,在index這一欄是看不到索引信息的。

而本人在刪除全文索引時(shí)遇到過一下報(bào)錯(cuò):

SQL> drop index searchkeytbl_key;
drop index searchkeytbl_key
ORA-29868: cannot issue DDL on a domain index marked as LOADING

解決方法:

ORA-29868: cannot issue DDL on a domain index marked as LOADING
說明:在創(chuàng)建索引的時(shí)候斷開、重啟等導(dǎo)致索引中斷沒有執(zhí)行成功,之后再drop或者rebuild等操作的時(shí)候都會(huì)報(bào)此錯(cuò)誤
解決:只能drop index ind_name force強(qiáng)行刪除,然后再重建

三、索引同步維護(hù)

用以下的兩個(gè)job來完成(該job要建在和表同一個(gè)用戶下) :

VARIABLE jobno number;
BEGIN
DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.sync_index(''index_name'');',
SYSDATE, 'SYSDATE + (1/24/4)');
commit;
END;      //同步
 
VARIABLE jobno number;
BEGIN
DBMS_JOB.SUBMIT(:jobno,'ctx_ddl.optimize_index(''myindex'',''FULL'');',
SYSDATE, 'SYSDATE + 1');
commit;     //優(yōu)化

建完后手動(dòng)運(yùn)行下:

exec dbms_job.run(jobno);

※個(gè)人體會(huì):運(yùn)行job可能會(huì)有問題,此時(shí)可以單獨(dú)運(yùn)行索引,嘗試一下

exec ctx_ddl.sync_index('index_name');

如果單獨(dú)運(yùn)行沒有問題,則檢查job是否寫錯(cuò)或者當(dāng)前操作的oracle數(shù)據(jù)庫(kù)用戶有無(wú)運(yùn)行存儲(chǔ)過程的權(quán)限

SQL> exec dbms_job.run(190);
begin dbms_job.run(190); end;

ORA-12011: execution of 1 jobs failed
ORA-06512: at "SYS.DBMS_IJOB", line 406
ORA-06512: at "SYS.DBMS_JOB", line 272
ORA-06512: at line 1

以上報(bào)錯(cuò)就是用戶沒有運(yùn)行任何存儲(chǔ)過程造成的,此時(shí)需要對(duì)用戶加上這個(gè)權(quán)限:

SQL> grant execute any procedure to oracle_username;

再看一下job的情況

select * from user_jobs;

四、測(cè)試

關(guān)聯(lián)查詢: select * from table_name where contains (column_name,'keyword') >0;
SQL> select * from searchkeytbl where type='城市' and contains (key,'楊浦') >0;

USERNAME             TYPE                                     KEY
-------------------- ---------------------------------------- --------------------------------------------------------------------------------
mujian80             城市                                     上海市楊浦區(qū)

五、問題

加全文索引遇到的問題(不斷更新)

SQL> create index gh_ghname_idx on gh(ghname) indextype is ctxsys.context parameters('lexer gh_ghname_lexer');
create index gh_ghname_idx on gh(ghname) indextype is ctxsys.context parameters('lexer gh_ghname_lexer')

ORA-24795: Illegal COMMIT attempt made
ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
ORA-20000: Oracle Text error:
DRG-50857: oracle error in drvddl.IndexCreate
ORA-20000: Oracle Text error:
DRG-50857: oracle error in drvdml.MaintainKTab
ORA-24795: Illegal COMMIT attempt made
ORA-06512: at "CTXSYS.DRUE", line 160
ORA-06512: at "CTXSYS.TEXTINDEXMETHODS", line 364
To avoid the error, please use one of the following solutions

1. Don't use a 32k-blocksized tablespace to store the internal index objects
- or -
2. Download Patch 5596325 from Metalink and apply it as described in the README file.

看一下 可能是用于創(chuàng)建索引的表空間不夠了

reports——>DBA——>total free space   pl/sql developer工具,查看表空間的剩余空間
select * from v$datafile;              查看數(shù)據(jù)文件信息

相關(guān)文章

  • oracle 日期時(shí)間函數(shù)使用總結(jié)

    oracle 日期時(shí)間函數(shù)使用總結(jié)

    經(jīng)常寫 sql 的同學(xué)應(yīng)該會(huì)接觸到一些 oracle 的日期時(shí)間函數(shù), 例如: 財(cái)務(wù)軟件或者人力資源軟件需要按照每年, 每季度, 每月, 甚至每個(gè)星期來進(jìn)行統(tǒng)計(jì)
    2014-05-05
  • Oracle10g通過DBLink訪問MySQL示例

    Oracle10g通過DBLink訪問MySQL示例

    本文介紹了Oracle訪問MySQL的方法,測(cè)試環(huán)境:CentOS5_X64, Oracle10g_X64, MySQL5 。大家參考使用吧
    2014-01-01
  • Oracle 11g Client客戶端安裝教程

    Oracle 11g Client客戶端安裝教程

    這篇文章主要為大家詳細(xì)介紹了Oracle 11g Client客戶端安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • 如何使用Oracle PL/SQL 實(shí)現(xiàn)發(fā)送電子郵件功能(UTL_MAIL)

    如何使用Oracle PL/SQL 實(shí)現(xiàn)發(fā)送電子郵件功能(UTL_MAIL)

    這篇文章主要介紹了Oracle PL/SQL 實(shí)現(xiàn)發(fā)送電子郵件功能,今天主要給大家介紹使用UTL_MAIL實(shí)現(xiàn)發(fā)送電子郵件功能,具體實(shí)例代碼跟隨小編一起看看吧
    2021-08-08
  • Oracle表空間設(shè)置和管理淺析

    Oracle表空間設(shè)置和管理淺析

    這篇文章主要給大家介紹了關(guān)于Oracle表空間設(shè)置和管理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Oracle具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Oracle管道函數(shù)pipelined?function的用法小結(jié)

    Oracle管道函數(shù)pipelined?function的用法小結(jié)

    這篇文章主要介紹了Oracle管道函數(shù)pipelined?function的用法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • oracle保留兩位小數(shù)解決方案

    oracle保留兩位小數(shù)解決方案

    公司需要處理一些報(bào)表,需要使用百分率,保留2位小數(shù),只用round和trunc函數(shù)都可以實(shí)現(xiàn)(round(_data,2) ),只是格式不是很工整,對(duì)格式要求不嚴(yán)謹(jǐn)?shù)那闆r下使用round即可
    2012-11-11
  • Oracle學(xué)習(xí)筆記(一)

    Oracle學(xué)習(xí)筆記(一)

    最近需要用的oracle,所以大家好好的學(xué)習(xí)下基礎(chǔ)并整理下資料,希望能幫助到需要的朋友。
    2011-12-12
  • oracle表分區(qū)的概念及操作

    oracle表分區(qū)的概念及操作

    Oracle的表分區(qū)功能通過改善可管理性、性能和可用性,從而為各式應(yīng)用程序帶來了極大的好處。這篇文章主要介紹了oracle表分區(qū)的概念及操作,需要的朋友可以參考下
    2021-04-04
  • 自動(dòng)備份Oracle數(shù)據(jù)庫(kù)

    自動(dòng)備份Oracle數(shù)據(jù)庫(kù)

    自動(dòng)備份Oracle數(shù)據(jù)庫(kù)...
    2007-03-03

最新評(píng)論