題記:前段時間做了乙個全文檢索的知識庫系統構建方案的調研,在此分享。
調研方案範圍
調研目的在於找到乙個在功能和效能上都比較優秀的全文檢索的知識庫系統實現方案;在調研過程中優先考慮如何實現全文字檢索功能,結合考慮系統的功能、效能、以及構建完整系統的效率。
構建全文檢索的知識庫系統有多種行之有效的方案,主要有以下三種實現思路:
方案a使用支援全文檢索功能的資料庫,構建大型文字管理資料庫系統,從檔案管理資料庫出發設計知識庫系統;
方案b使用全文搜尋引擎實現全文字檢索功能,以此開始設計知識庫系統;
方案c使用wiki構建知識庫系統。
以下分別介紹。
1全文檢索資料庫方案
1.1 oracle text介紹
支援全文檢索的資料庫以建立和維護索引的方式對儲存在資料庫表中的大型文字系統執行有效率的文字搜尋。
知識庫系統中全文搜尋的物件主要是表達知識資訊的文章,典型的搜尋應用可能是查詢出標題或者內容中含有某個搜尋項的所有文章。把知識庫中的文章儲存在按照標題、內容等文字字段建立起來的資料庫表中,實現知識庫系統中的全文查詢也就同資料庫中的全文檢索功能等同起來了。
oracle實現全文檢索的的元件在oracle9i中稱為oracle text。oracle text的體系結構如下圖, 在本次調研所關注的範圍裡,這個體系結構的中心是為儲存在資料庫中的文章的標題、內容等字段資訊建立索引。
圖一 oracle text體系結構
1.2 demo- 使用oracle資料庫實現中文全文檢索
目標:確認oracle text支援中文全文檢索功能、總結操作過程,並探求更好的效能。(demo基於oracle9.02個人版,企業版和標準版應該得到同樣的結果。)
這裡介紹主要的過程:
步驟1 確保資料庫的一些配置項
(1)檢查資料庫是否安裝了oracle text元件(oracle9i預設安裝)
如果沒有則執行$oracle_home/bin/dbassist, 選擇'modify database', 然後在選擇資料庫功能時將jserver和intermedia都選中;
(2) 檢查伺服器是否有對pl***tproc服務的監聽
windows shell命令視窗下執行lsnrctl status,在列印資訊中通常有
pl***tproc has 1 service handler(s)
這樣一段即表明外部呼叫功能開啟; 否則需要修改$oracle_home/network/admin/listener.ora以開啟該功能;
步驟2 建立資料庫knowledge並建立乙個ctxtest使用者
(1)建立資料庫knowledge
(2)在資料庫knowledge下建立ctxtest使用者
create user ctxtest identified by ctxtest;
步驟3 進行資料庫設計並建表
(1)使用powerdesigner為知識庫系統建立乙個大致的概念模型如下,匯出物理檢視並生成sql指令碼,在資料庫例項knowledge中生成表;demo中需要用到article和version兩張表,這兩張表分別表示文章的和文章的每個版本,並且假定每個版本的內容、作者、附件都可以改變,但是文章標題不可以修改。
圖二 知識庫系統的概念模型
(2)在建立的表中插入一些記錄,其中包含一條:
insert into version(id, content) values(1,'上午好');
insert into version(id, content) values(2,'上午好');
insert into version (id, content) values(3,'我是中國人,我深深的愛著我的祖國和人民,我是人民的兒子');
步驟4 建立索引
以ctxtest使用者連線到knowledge資料庫
(1)建立首選項
begin tx_ddl.create_preference('my_lexer','chinese_vgram_lexer'); end;
(2)建立索引
create index myindex on version(content) indextype is ctxsys.context
parameters('lexer my_lexer');
如上命令以oracle提供的中文分詞器chinese_vgram_lexer對version表的content欄位建立了索引。建立的索引儲存在ctxsys使用者預設的臨時表空間裡以dr$打頭的4個表: dr$myindex$i、dr$myindex$k、dr$myindex$r、dr$myindex$n,其中以表dr$myindex$i最為重要。查詢一下該錶
select token_text, token_count from dr$myindex$i;
可以發現該表中儲存的就是對article表的content欄位分析得到的全部索引項。
步驟5 執行查詢
select * from version where contains(content,』中國人』) >0;
可以查出剛剛插入**中的第三條記錄
步驟6 建立維護索引的job
索引在剛才執行建立索引的語句後被建立,但是此後對資料庫執行的任何增刪改操作都不會引起索引的同步更新。因此需要建立乙個同步更新操作的job執行同步更新操作;
另一方面,在執行多次同步更新之後,索引區會引起索引項的稀釋,勢必需要優化,因此還需要為資料庫建立乙個定期優化索引結構的job.
這兩個job可以建立如下:
同步sync:
variable jobno number;
begin dbms_job.submit(:jobno,'ctx_ddl.sync_index(''myindex'');', sysdate, 'sysdate + (1/24/4)');
commit; end;
優化optimizer:
variable jobno number;
begin dbms_job.submit(:jobno,'ctx_ddl.optimize_index(''myindex'',''full'');', sysdate, 'sysdate + 1');
commit; end;
其中, 第乙個job的sysdate + (1/24/4)是指每隔15分鐘同步一次,第二個job的sysdate + 1是每隔1天做一次全優化。具體的時間間隔,可以應用需要而定。
至此,全文檢索功能已設定完成。
1.3兩個問題
1.3.1 oracle text 對html建立索引的支援
回顧oracle text的體系結構圖,oracle text在將文字分詞建立索引項時已經充分考慮到了支援html、xml等格式化的文件在建立索引時過濾掉無表意內容的格式指令碼。
這可以通過在建立索引時設定section groups區分組來實現。sql語句如下:
begin
ctx_ddl.create_section_group ('my_section_group', 'basic_section_group');
ctx_ddl.add_field_section (
group_name=> 'my_section_group',
section_name=> 'title',
tag => 'title',
visible=> false
);end;/
drop index my_html_idx;
create index my_html_idx on version( context )
indextype is ctxsys.context
parameters( 'section group my_section_group' )/
select id from version where contains (content, '上午好 within title') > 0;
1.3.2 中文分詞程式設定的改進
在為建立引擎建立lexer首選項時,設定的分詞器是oracle提供的chinese_vgram_lexer。實際上oracle還提供了乙個chinese_lexer. 比較而言,這個分詞器分詞演算法更智慧型、效率更高。在demo中就表中第三條記錄的content欄位建立索引項時,索引項由chinese_vgram_lxer的53個減少到31個。
在官方文件中提到
chinese_lexer
僅支援utf-8
字符集的資料庫,
demo
過程中,發現在
zhs16gbk
中也能夠使用。
(未完,待續)
系統學習Lucene全文檢索技術(一)
為了解決資料庫壓力和速度的問題,我們的資料庫就變成了索引庫,我們使用lucene的api的來操作服 務器上的索引庫。這樣完全和資料庫進行了隔離。1 順序掃瞄法 演算法描述 所謂順序掃瞄,例如要找內容包含乙個字串的檔案,就是乙個文件乙個文件的看,對於每乙個文件,從頭看到尾,如果此文件包含此字串,則此文...
車輛知識庫系統資料庫詳細設計
實體 1 使用者 使用者id,姓名,密碼,性別,address,phone,e mail 2 文件 docid,使用者 id,標題,摘要,文字,類別,編輯許可權,閱讀許可權 3 資料 檔案id,標題,摘要,資料檔案,車型 id,檔案型別,檔案屬性,閱讀許可權 4 車型 車型id,車輛名,車輛型號,錄...
閱讀《你的知識需要管理》一書之建立你的知識庫
你的知識需要管理 這本是技巧類的書,主要是教你怎樣去學習知識,儲存知識,共享知識,使用知識和創新知識。其中一些觀點很新穎,我也覺得很受用。我先把我做的思維導圖放出來。在這本書裡,我最為深刻和受用的是以下幾個關於知識管理的建議 我自己總結之 1 很多知識你只需要知道怎樣找到即可,無需記住 2 建立你的...