2006年02月13日
10g 全文檢索
OS:centos 4.0
oracle:10.1.2
使用的帳號為db_test
使用系統管理者登入,並且授於db_test相關的權限
GRANT "CTXAPP" TO "db_test";
ALTER USER "db_test" DEFAULT ROLE ALL;
GRANT EXECUTE ON "CTXSYS"."CTX_ADM" TO "db_test";
GRANT EXECUTE ON "CTXSYS"."CTX_CATSEARCH" TO "db_test";
GRANT EXECUTE ON "CTXSYS"."CTX_CONTAINS" TO "db_test";
GRANT EXECUTE ON "CTXSYS"."CTX_DDL" TO "db_test";
GRANT EXECUTE ON "CTXSYS"."CTX_DOC" TO "db_test";
GRANT EXECUTE ON "CTXSYS"."CTX_QUERY" TO "db_test";
GRANT EXECUTE ON "CTXSYS"."CTX_ULEXER" TO "db_test";
GRANT EXECUTE ON "CTXSYS"."CTX_XPCONTAINS" TO "db_test";
因為我有中文,所以採用chinese_lexer
SQL> begin ctx_ddl.create_preference('new_lexer','chinese_lexer'); end;
2 /
PL/SQL procedure successfully completed.
這樣子就建立了一個object了
再來建立index
SQL> create index km_t_data_user_id_tqindex<index名字> on t_data<那個table>(user_id<欄位名字>) indextype is ctxsys.context parameters('LEXER db_test.new_lexer');<使用者名字.建立的object>
Index created.
刪除index
drop index name_index;
索引同步
exec ctx_ddl.sync_index('<index名字>');
查尋用法
SQL> select subject from t_data where contains(subject,'oracle',1)>0;
附記:
設置詞法分析器(lexer)
Oracle實現全文檢索,其機制其實很簡單。即通過Oracle專利的詞法分析器(lexer),將文章中所有的表意單元(Oracle 稱為
term) 找出來,記錄在一組 以 dr$開頭的表中,同時記下該term出現的位置、次數、hash 值等信息。檢索時,Oracle
從這組表中查找相應的
term,並計算其出現頻率,根據某個算法來計算每個文檔的得分(score),即所謂的『匹配率’。而lexer則是該機制的核心,它決定了全文檢索的
效率。Oracle 針對不同的語言提供了不同的 lexer, 而我們通常能用到其中的三個:
basic_lexer:
針對英語。它能根據空格和標點來將英語單詞從句子中分離,還能自動將一些出現頻率過高已經失去檢索意義的單詞作為『垃圾’處理,如if , is
等,具有較高的處理效率。但該lexer應用於漢語則有很多問題,由於它只認空格和標點,而漢語的一句話中通常不會有空格,因此,它會把整句話作為一個
term,事實上失去檢索能力。以『中國人民站起來了’這句話為例,basic_lexer 分析的結果只有一個term
,就是『中國人民站起來了’。此時若檢索『中國’,將檢索不到內容。
chinese_vgram_lexer:
專門的漢語分析器,支持所有漢字字符集。該分析器按字為單元來分析漢語句子。『中國人民站起來了’這句話,會被它分析成如下幾個term:
『中’,『中國’,『國人’,『人民’,『民站’,『站起’,起來’,『來了’,『了’。可以看出,這種分析方法,實現算法很簡單,並且能實現『一網打盡
’,但效率則是差強人意。
chinese_lexer: 這是一個新的漢語分析器,只支持utf8字符集。上面已經看到,chinese vgram
lexer這個分析器由於不認識常用的漢語詞彙,因此分析的單元非常機械,像上面的『民站’,『站起’在漢語中根本不會單獨出現,因此這種term是沒有
意義的,反而影響效率。chinese_lexer的最大改進就是該分析器
能認識大部分常用漢語詞彙,因此能更有效率地分析句子,像以上兩個愚蠢的單元將不會再出現,極大 提高了效率。但是它只支持 utf8,
如果你的數據庫不是utf8字符集,則只能使用笨笨的那個Chinese vgram lexer.
參考網址:
http://www.itpub.net/197928.html
http://bbs.hidotnet.com/12205/ShowPost.aspx
http://ilike.blog.ccidnet.com/blog/ccid/do_showone/tid_17310.html
引用URL
http://cgi.blog.roodo.com/trackback/1115590
回應文章 
如果分析詞彙的詞組庫取代了全面意義的全文檢索
會不會造成很多東西都搜尋不到...只有白話常用詞彙才能被搜尋??
像是google 的gmail 或是網上群組的搜尋功能一樣
現在已經有一堆爛程式中文搜尋不完整
在這樣的情況下,比較笨的機制是不是比較好?
會不會造成很多東西都搜尋不到...只有白話常用詞彙才能被搜尋??
像是google 的gmail 或是網上群組的搜尋功能一樣
現在已經有一堆爛程式中文搜尋不完整
在這樣的情況下,比較笨的機制是不是比較好?
Posted by pray
at 2006年02月13日 02:46
嗯,你說沒有錯,會有一些東西會找不到,如打錯字的,那就無法,不過這要看你是否覺的效能較重要,不然你也可用純sql語法的方法來尋找,那你就要付出一些效能的問題了。我們現在是用sql的方法來尋找,資料量大約40萬筆,在熱門時間尋找會較慢,一般來說覺的還好
Posted by 敗家貓
at 2006年02月13日 10:33