程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> 一種實現 DB2 數據庫的各類查詢與全文檢索的替代方案

一種實現 DB2 數據庫的各類查詢與全文檢索的替代方案

編輯:DB2教程

一種實現 DB2 數據庫的各類查詢與全文檢索的替代方案

各類基於數據庫的 Web 應用,由於數據量的爆炸式增長和用戶量的劇增,導致數據庫壓力越來越大,甚至成為 web 應用的瓶頸,特別是利用數據庫來實現系統全文檢索時。本文利用一個實際項目解決方案的經驗,提供一種降低數據庫壓力的方案,即讓數據庫(如 DB2)與企業級搜素引擎 OmniFind 整合,使用 OmniFind 來做一些實時性不強的查詢和全文檢索,讓數據庫來做實時信息的查詢、數據存儲與更新及其他更核心的功能,從而大大的降低數據庫壓力同時提高查詢性能。

概述

目前 web 數據庫應用中存在的問題

對於大多數的電子商務網站和大公司的網站或其內部信息系統,都有自己的搜索功能。而這些搜索功能大多使用數據庫查詢或全文檢索,或者借助外界的搜索引擎,如 Google 站內搜索。如果使用數據庫,則檢索速度變慢,對於一個大型網站,如果用戶特多就會導致數據庫壓力巨大,檢索速度更慢,導致整個系統響應速度下降,最終影響數據庫其他核心功能的發揮,給用戶造成不好的體驗;如果借助外界搜索引擎,一方面會導致搜索的結果不全,用戶想要的信息找不到(可能外界搜索引擎不能爬取所有信息),另一方面存在安全隱患,無法控制權限等。

IBM OmniFind 簡介

IBM OmniFind 是一個優秀的企業級信息搜索平台,符合企業級搜索的特點。它可以支持企業中多種數據源的檢索查詢,如文件系統、數據庫、郵件系統、企業內容管理系統等;並且還可以通過 UIMA 集成第三方的分析工具;同時可以滿足企業信息搜索的高安全性、高可用性、高性能以及可擴展性等要求;提供多種部署方式可以靈活的滿足多樣化的企業搜索需求。

圖 1. IBM OmniFind 為企業信息搜索提供了完善的解決方案
一種實現 DB2 數據庫的各類查詢與全文檢索的替代方案

查看原圖(大圖)

讓企業數據庫(如 DB2)與 OmniFind 無縫整合

如果該企業將其數據庫中實時性不強的信息查詢與檢索讓 OmniFind 來實現,數據庫只需做那些實時性極強的查詢與檢索,則數據庫的壓力將會大減,能夠更好完成其核心功能,則上述問題迎刃而解。

實現思路如下:OmniFind 查詢替代數據庫查詢或全文檢索,將需要替代查詢的表按表結構,使用 OmniFind JDBC Crawler 爬取到 OmniFind 原始數據庫中(此時可以通過 JDBC Crawler Plug-in 對需要進行表連接的表進行連接),這些爬取工作可以在數據庫閒暇時進行,如每日臨晨 3 點等;爬取完成後,使用 OmniFind parser 對原始數據進行解析,如果要對數據查詢使用一些特殊文本分析或實現智能查詢等,則可在解析時使用 UIMA 來添加自己的分析器;解析完成後,使用 OmniFind Indexer 進行索引,索引完成後就可以利用 OmniFind 高級查詢語法來實現 Sql 查詢一樣的功能了(如果想用 OmniFind 對一些實時性強的信息進行檢索,則可以把這些信息放到另一個集合中,在這個集合的 crawler\parser\indexer 上設置定時器來提高實時爬取和索引)。

上述查詢只是對 OmniFind 索引文件進行,不再需要使用數據庫,因此就不會對數據庫造成壓力;同時如果該表要使用 OmniFind 查詢來替代數據庫查詢,則這個表就不需要建立任何索引,從而可以提高對他的插入和更新性能,並且節省存儲空間;此外,OmniFind 查詢是次秒級的,在全文檢索速度和性能方面要遠優於數據庫全文檢索。

如果我們再利用上 OmniFind 的如下特性,則會更能夠顯示出整合的優越性:

提供動態文檔摘要:OmniFind 在返回結果時,可以自動根據搜索串對文檔進行動態的摘要處理,這是數據庫全文檢索不具備的,而對用戶來說是卻很有價值,可以讓用戶馬上知道這是否是他要查詢的信息。

提供搜索結果匹配度信息,對命中的詞匯進行高亮顯示,對搜索詞糾錯,模糊搜索和同義詞擴展,甚至語義搜索。

提供結果排序能力,支持三種排序方式。第一種為 Text based scoring,動態計算匹配度評分。第二種支持 Static Ranking,能夠根據文檔本身的因素(如:文檔被引用的計數值或文檔的時間戳)對范圍結果的排序產生影響。第三種支持領域詞不同權重的排序。用戶可以按照需要選擇排序規則,將滿足自己需要的信息排在最前面。

提供二次檢索能力,即在第一次搜索的查詢串基礎上添加新的查詢要求。OmniFind 二次檢索時,將首先從 cache 中提取信息,這種方式無疑將大幅縮短檢索時間,提高檢索效率。

支持搜索詞過濾。

圖 2. DB2 整合 OmniFind 解決方案圖
一種實現 DB2 數據庫的各類查詢與全文檢索的替代方案

查看原圖(大圖)

圖 3. 基於數據庫的 Web 應用通用的解決方案圖
一種實現 DB2 數據庫的各類查詢與全文檢索的替代方案

查看原圖(大圖)

圖 4. DB2 使用 DB2 Text Information Extender 進行全文檢索的客戶 / 服務器端的運行環境
一種實現 DB2 數據庫的各類查詢與全文檢索的替代方案

查看原圖(大圖)

從以上三幅圖我們可以看出,用圖 3 和圖 4 中的方式,所有的查詢和全文檢索都直接作用到數據庫上,而只有圖 2 中的方式不需要數據庫 DB2 的參與。

針對 DB2 數據庫的 JDBC Crawler 及其插件配置

本文用到的示例的相關說明

文中將用到的示例是使用 OmniFind 搜索查詢語法替代 DB2 中的一些查詢和全文檢索。該示例提出了實現這一功能的詳細步驟和需要注意的事項,並且展示了如何簡單的通過定制用戶搜索程序界面來實現全文檢索,而使得用戶不需要知道 OmniFind 搜索的高級語法。

示例配置:測試的 DB2 數據源:IBM DB2 V9.1;企業搜索軟件:IBM OmniFind Enterprise Edition V8.5;二者運行在同一機器上,運行平台是 Windows Server 2003。

創建需要查詢的數據源:

清單 1. 創建數據庫表

 CREATE TABLE ADMINISTRATOR.PRODUCTINFO( 
 PID BIGINT NOT NULL GENERATED 
 ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE), 
 NAME VARCHAR (20), 
 DESCRIPTION VARCHAR (500), 
 CONSTRAINT CC1249002699531 PRIMARY KEY (PID) 
 ) ; 
 
 CREATE TABLE ADMINISTRATOR.SALESINFO ( 
 ENTRYID BIGINT NOT NULL 
 GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE ) , 
 PID BIGINT , 
 ENTERTIME DATE , 
 PRICE DOUBLE , 
 QUANTITY INTEGER COMPRESS SYSTEM DEFAULT , 
 CONSTRAINT CC1249003462656 PRIMARY KEY ( ENTRYID) , 
 CONSTRAINT CC1249003468250 FOREIGN KEY (PID) REFERENCES 
 ADMINISTRATOR.PRODUCTINFO (PID) ON DELETE 
 NO ACTION ON UPDATE NO ACTION ENFORCED 
 ENABLE QUERY OPTIMIZATION 
 ) VALUE COMPRESSION ; 

清單 2. 存儲測試數據源

 insert into productinfo values 
 (1,'thinkpad computer','lenenvo thinkpad t7.0, enhanced version'); 
 insert into productinfo values 
 (2,'thinkpad computer','lenenvo thinkpad t8.0, student version'); 
 insert into productinfo values 
 (3,'dell computer','dell student t8.0, student version'); 
 insert into productinfo values 
 (4,'sony computer','sony bussiness t8.0, network version'); 
  
 insert into enterwarehouseinfo values(1,1,'2009-07-30',900,20); 
 insert into enterwarehouseinfo values(2,2,'2008-07-30',1005,20); 
 insert into enterwarehouseinfo values(3,3,'2006-07-27',2005,30); 
 insert into enterwarehouseinfo values(4,1,'2006-07-27',2005,60); 
 insert into enterwarehouseinfo values(5,2,'2005-06-20',1500,60); 
 insert into enterwarehouseinfo values(6,4,'2009-06-27',500,80); 

JDBC Crawler Plug-in

OmniFind JDBC Crawler Plug-in 是一個 XML 格式的配置文件,用來定義要爬取的各表間關系及爬取處理規則,可以用來做表連接。OmniFind Crawler 會按照這個 plug-in 上的說明進行連接爬取,使得多表中的每條記錄鏈接後生成一個單一的文檔。檢索時只要查詢某個表中的任何一個字段,與之關聯的其他表就會自動的連接並返回給查詢用戶,這一點類似於 Hibernate 的表連接查詢方式,同時還可以用它來配置搜索的字段屬性。

根據以上特征,在編寫該插件文件時,必須先要搞清楚要爬取的數據庫中各表間的關系,同時要注意用來主外鍵關聯的鍵名在兩個表中必須一樣,就如示例中 PID 一樣,在 SaleInfo 表中為外鍵,與其在被參照表 Product 中的主鍵名一致。 示例中的表結構關系見下圖。

圖 5. 示例中表結構關系圖
一種實現 DB2 數據庫的各類查詢與全文檢索的替代方案

清單 3. 示例的 crawler plug-in 配置文件

 <XML version="1.0" encoding="UTF-8"> 
 <Crawler Version="1.00"> 
 <DataSources> 
 <Server DBURL="jdbc:db2://9.181.139.53:50000/liyulong"> 
 <JDBCDriver>com.ibm.db2.jcc.DB2Driver</JDBCDriver> 
 <User>db2admin</User> 
 <Password Encryption="False">search</PassWord> 
 <Delimiters Use="True"> 
 <Delimiter>,</Delimiter> 
 <SecondDelimiter>;</SecondDelimiter> 
 </Delimiters> 
 <RelationMap Root="ADMINISTRATOR. SALESINFO "> 
 <Relation Parent="ADMINISTRATOR. SALESINFO" ParentAlias="T0" ParentKey="PID" 
Child="ADMINISTRATOR.PRODUCTINFO" ChildAlias="T1" ChildKey="PID" /> 
 </RelationMap> 
 <Target TableAlias="T1"> 
 <Field Name="PID" FIEldName="PID" Enabling="False" 
 Searchable="True" FIEldSearchable="True" IsContent="True" /> 
 <Field Name="NAME" FIEldName="NAME_PRODUCTINFO" Enabling="True" 
Searchable="True" FIEldSearchable="True" IsContent="True" /> 
 <Field Name="DESCRIPTION" FIEldName="DESCRIPTION_PRODUCTINFO" 
 Enabling="True" Searchable="True" FIEldSearchable="True" IsContent="True" /> 
 </Target> 
 </Server> 
 </DataSources> 
 </Crawler> 

以下是使用該插件後對 ProductInfo 表和 SalesInfo 表以 PID 做自然連接後保存在 OmniFind 原始數據庫中的 document 示例:

圖 6. 示例中表連接後的結果
一種實現 DB2 數據庫的各類查詢與全文檢索的替代方案

查看原圖(大圖)

在配置 crawler plug-in 過程中要注意如下事項: FIEld 的 Name 屬性字段最好帶上能夠標識表名的信息,這在後邊進行特定表的字段查詢中比較方便,特別是不同表有相同字段名時;RelationMap 的 Root 屬性應該是包含外鍵的表,而不是被外鍵參照的表;PassWord 的 Encryption 可以加密,如果 true 就是加密,則要使用密碼的加密值。更詳細的信息請參照 IBM OmniFind information center 上關於 crawler plug-in 部分。

DB2 JDBC Crawler 及 crawler plug-in 配置

注意事項:在使用 DB2 JDBC Crawler 前,請確保您安裝 OmniFind Crawler 的服務器上至少安裝了 DB2 ClIEnt。

配置詳細步驟:

首先,復制 ES_INSTALL_ROOT/default_config/crawler_rdb_plugin.xml到 ES_NODE_ROOT/master_config/並創建 crawler_rdb_plugin.XML。

第二,按照需求及數據庫設計編輯 crawler_rdb_plugin.XML。

第三,保存編輯後,依次調用如下命令:

 esadmin system stop 
 esadmin system start 

第四,用這個 crawler plug-in 配置 JDBC crawler,具體步驟如下:

啟動 OmniFind 管理控制台,創建一個 collection,打開爬蟲配置頁面;

創建一個 JDBC crawler;

在表單的插件類名字段中填入 com.ibm.es.plugin.rdb.RDBPlugin;

在表單的插件類路徑上,填寫完整的插件類路徑和 JDBC 驅動類路經:

 C:\Program Files\IBM\es\lib\plugin_rdb.jar; 
 C:\Program Files\IBM\SQLLIB\Java\db2jcc.jar; 
 C:\Program Files\IBM\SQLLIB\Java\db2jcc_license_cu.jar; 

圖 7. 插件配置界面
一種實現 DB2 數據庫的各類查詢與全文檢索的替代方案

查看原圖(大圖)

點擊下一步,配置要爬取的數據庫的 JDBC Crawler 基本信息,如驅動類,類路徑,URL,密碼,爬取時間設置等,如圖 8 所示:

圖 8. 配置要爬取的數據庫的 JDBC Crawler 基本信息
一種實現 DB2 數據庫的各類查詢與全文檢索的替代方案

查看原圖(大圖)

Figure xxx. Requires a heading
一種實現 DB2 數據庫的各類查詢與全文檢索的替代方案

查看原圖(大圖)

連續點擊下一步來配置要爬取的表,注意在這一步,您只需要配置 parent 表和 crawler plug-in 中沒有出現的表即可;

圖 9. 配置要爬取的表
一種實現 DB2 數據庫的各類查詢與全文檢索的替代方案

查看原圖(大圖)

在彈出的頁面中點擊完成,或繼續設置其他詳細的搜索信息;

第五,停止 crawler, 再啟動它,並爬取數據庫。

第六,使用控制台進行 parser 和 index,如果您用的是 OmniFind8.5, 在索引時您還需要設置啟用模糊字符配置,如圖 10:

圖 10. 配置模糊字符配置
一種實現 DB2 數據庫的各類查詢與全文檢索的替代方案

查看原圖(大圖)

第七,使用 OmniFind 實現數據庫查詢。

DB2 數據庫查詢語句的 OmniFind 查詢實現舉例

使用 OmniFind 的高級查詢語法,如:Field:text, #Field::<value, FIEld_name=”multiple Words”來實現 DB2 的一些簡單查詢和全文檢索。

DB2 的 select, where , like , in,and 等的 omniFind 實現舉例

SQL 中 from where field(=, <,>,<=,>=) 等字符串型的條件比較等價於 OminFind 中 FIEld:text,如:

 SQL: select * from salesinfo, productinfo where name=”thinkpad computer” 
 OmniFind query: NAME_PRODUCTINFO:”thinkpad computer” 

圖 11. 示例搜索結果
一種實現 DB2 數據庫的各類查詢與全文檢索的替代方案

查看原圖(大圖)

SQL 中 from where field(=, <,>,<=,>=) 等數值型的條件比較等價於 OminFind 中 #FIEld::(=, <,>,<=,>=)value,如:

 SQL: select * from salesinfo, productinfo where price>1000 and price<1500 
 OmniFind query: #price::<1500>1000 

圖 12. 示例搜索結果
一種實現 DB2 數據庫的各類查詢與全文檢索的替代方案

查看原圖(大圖)

SQL 中的 from where and 等價於 OminFind 中多個域的與查詢條件用空格間隔就行,如:

 SQL: select * from salesinfo, productinfo 
where name=”thinkpad computer” and price>1000 and price<1500 
 OmniFind query: NAME_PRODUCTINFO:"thinkpad computer" #price::<1500>1000 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved