用Solr、Nutch等開源軟件來構建電子元器件垂直搜索引擎涉及很多實現細節,本文結合實際應用系統對數據采集、中文搜索、結果輸出、分頁處理、整合數據庫等重點問題提出了切實可行的解決方法。
針對搜索引擎的各種開源技術是開源社區的一枝奇葩,它大大縮短了構建搜索應用的周期,并使得根據特定需求打造個性化應用的垂直搜索引擎系統成為可能。作為一個獨立的企業搜索應用解決方案,Solr在美國的眾多知名網站中得到應用,如美國最大的科技資訊類網站CNet。Solr基于高性能的Lucene開發,它不僅實現了比Lucene更為豐富的查詢語言和更為優異的查詢性能,而且實現了可配置、可擴展,對外提供類似于Web 服務的API接口。用戶可通過Http請求向搜索引擎服務器提交指定格式的XML文件生成索引,也可以通過“Http Get”操作提出查詢請求,并得到XML格式的返回結果。Solr結合其他開源搜索軟件成為構建行業垂直搜索引擎的優選方案。
垂直搜索引擎的總體結構
本文所述的電子元器件垂直搜索引擎以Solr 1.4為核心框架,綜合應用Nutch、IK Analyzer等開源軟件,充分利用它們靈活的配置、豐富的功能以及高效的性能,力求用最簡單的代碼,快速實現海量電子元器件信息的采集、文本搜索、參數檢索,滿足技術研究人員與市場采購人員對于行業領域知識的專、精、深要求。
電子元器件垂直搜索引擎系統包括數據采集、數據加工、數據規劃和管理、搜索服務四個主要部分。數據采集部分負責對Internet、Intranet、內部電子文檔、結構化數據(關系數據庫、XML)等進行抓取、濾重、分類、摘要; 數據加工部分負責對采集來的數據進行篩選、編輯和審校; 數據規劃和管理部分負責系統元數據的定義與管理,包括分類體系、特性參數、參數類型、計量單位等; 搜索服務則為用戶提供分類導航、數據檢索、行業報告及其他個性定制服務(系統的總體結構如附圖所示)。本文結合選取其中的數據采集(Web頁面抓取、結構化數據采集、中文支持)、搜索結果呈現(層面瀏覽、高亮顯示、分頁處理)等幾個重點實現方法進行介紹。
數據采集
1. Web頁面抓取
采集互聯網Web頁面的數據并非Solr所長,我們可以借助在這方面有著突出表現的Nutch。Nutch基于Hadoop分布式系統,既可以在單臺機器上運行,也可以在多臺機器構成的集群上運行。Nutch可以根據用戶需要配置優先抓取某些頁面,而且抓取質量很高。
本系統我們利用Solr作為處理搜索結果的源和入口,而讓Nutch負責它最擅長的工作: 抓取和提取內容。Nutch的配置文件是nutch-site.xml,配置的內容包括指定蜘蛛的名稱、激活插件、限制單機一次運行抓取的最大URL數、指定抓取規則等。完成這些基本配置以后就可以進行抓取分析操作。
2. 結構化數據采集
為了充分利用現有資源,提高數據檢索效率,我們把收錄了100多萬條電子元器件產品、1000多萬條特性參數信息的中國電子元器件產品數據庫和中國電子廠商數據庫、韓國電子元器件信息庫作為結構化數據源,向Solr一次全部導入數據,后續維護的部分使用增量導入。用于搜索的表主要涉及產品基本信息表、廠商基本信息表、分類表、特性參數表、參數模板表、模板信息表、產品特性參數值表、計量單位表等。
Solr通過可配置的方式將數據庫中多列、多表的數據生成Solr文檔。配置的方法是在域結點內定義具體的字段(類似數據庫中的字段),然后通過配置文件導入所有數據,發現并處理由插入、更新帶來的變化。
3. 中文搜索支持
Solr的分析包并沒有直接提供中文搜索支持。這里選用輕量級的中文分詞工具包IK Analyzer來配合工作。IK Analyzer基于Java開源,如今新版本的IKAnalyzer 3.2.0已發展為面向Java 的公用分詞組件,獨立于Lucene 項目,同時提供了對Solr的專用接口。
電子元器件搜索引擎系統利用的IK Analyzer特性包括: 特有的“正向迭代最細粒度切分算法”具有60 萬字/秒的高速處理能力; 多詞元處理器分析模式,支持英文字母(IP 地址、Email、URL)、數字(日期、常用中文數量詞、羅馬數字、科學計數法),中文詞匯(姓名、地名處理)等分詞處理; 優化的詞典存儲更小占內存用; 針對Lucene 全文檢索優化的查詢分析器IKQueryParser; 采用歧義分析算法優化查詢關鍵字的搜索排列組合,可極大地提高檢索的命中率。
由于電子元器件垂直搜索應用面向特定的專業領域,IK Analyzer本身雖然已經提供很豐富的常用詞匯,但對于專業性強的應用仍然顯得捉衿見肘。好在IK Analyzer提供了良好的擴展能力,我們利用配置文件輕易實現了用戶詞典的擴展與定制,這樣就可以搜索到如“精密薄膜柱狀無引線電阻器”、“半波隨機型固體繼電器”這些專業詞匯了。
搜索結果呈現
Solr的搜索結果通常以XML格式返回,這對于普通用戶而言不合適,不過Solr提供了多種途徑(如正則表達式和文本解析)將搜索返回的結果信息進行重新布局,以產生用戶易于理解的可視頁面,但都需要大量的編碼工作。在系統中我們利用XSLT把XML格式的結果文件轉換成HTML文件。經過轉換后,就可以得到能看到搜索結果的頁面了。
Solr提供了層面瀏覽(facet)功能,它類似于一種分類篩選。運行層面無需在Solr 中進行配置,但可能需要按照新的方式對應用程序內容進行索引。在已索引的字段中完成分層,層面對未進行斷詞的非小寫詞最為有效。Facet 字段通常不需要存儲,因為分層面的總體思想就是將可讀的值顯示給用戶。要注意的是, Solr 沒有在層面中創建類別,必須由應用程序自身在索引期間進行添加,正如在索引應用程序時給文檔指派關鍵字一樣。如果存在層面字段,Solr 就提供了查明這些層面及其計數的邏輯。
另外,為了在搜索結果中取得最匹配的一段文本并突出顯示出來,有必要對搜索結果進行高亮顯示。高亮顯示可修改配置文件實現。該配置中包括了高亮文本時使用的前綴和后綴(通常在此指定突出顯示文本的字體、字號、顏色或其他風格)。
如果搜索結果較多還需要分頁,但我們不希望自行編寫復雜的代碼實現分頁。我們在系統中使用了一個開源的分頁插件,專門為Solr量身定制,由它對 Solr 的搜索結果進行分頁處理。
實際上,Solr的功能遠不止以上這些,還有很多通過簡單配置和少量修改即可實現的搜索功能有待研究開發。目前,我們圍繞以Solr為主體的探索以及各項功能的實現仍在繼續,力求在保證系統功能與性能的前提下,充分利用開源軟件的優勢,降低開發成本。
(作者單位:董婭為電子工業出版社、周峻松為工業和信息化部電子科學技術情報研究所)