李建平,簡 晨
(國家無線電監測中心陜西監測站,陜西 西安 710200)
Lucene是一個開放源代碼的全文檢索工具包但不是一個完整搜索引擎,僅提供了構建搜索引擎的基礎架構,我們可以通過Lucene官網站下載該工具包,然后利用這個基礎架構快速地開發出搜索引擎。Lucene的原作者是Doug Cutting,一位資深的全文檢索專家,最初將Lucene發表在自己的個人主頁上,2001年將Lucene捐獻給Apache,使得Lucene成為Jakarta的一個子項目[1]。
Luence的出現使得全文搜索得到了極大的發展,開發者不僅可以根據Luence的API開發搭建獨立的搜索引擎,而且還能夠將它集成到各種系統軟件以及商業軟件中,著名的商業軟件Eclipse的幫助文檔的搜索就是采用了Luence的API。
Luence作為全文搜索引擎,具有以下優勢[2]:
⊙ Luence的索引文件是以8位字節為基礎的,使得可以兼容各種不同的平臺。
⊙ 在傳統的全文檢索引擎倒排索引的基礎上,實現了分塊索引,提升了索引速度。
⊙ 優秀的面向對象的系統架構,降低了開發人員的學習難度。
在上文中介紹了Lucence,開發人員可以利用API擴展到自己的系統軟件中,但是這對于非專業的開發人員來說,要通過Lucence API來進行開發,難度還是很大,基于此,solr全文搜索引擎[3]應運而生,它很好地解決這個問題,使得Lucence在全文搜索領域得到進一步的發展。
從圖1可以看出,solr是在Lucence java開源搜索包的基礎上實現的一個獨立的全文搜索引擎,可以獨立運行在Servelet容器中。solr對用戶和開發者提供了兩種訪問接口,一種是HTTP訪問接口,通過solr自帶的簡單的Web界面進行交互,適合比較簡單應用,另一種是API接口,通過這些API開發者可以根據用戶需求定制搜索功能開發。

圖1 solr全文搜索架構
solr配置使用過程[4]如下,建議JDK8.0,Tomcat7.0以上,solr選擇4.5版本以上。
①按照要求安裝JDK,配置成功環境變量;
②下載并且成功安裝Tomcat;
③解壓solr4.5,將solr.war文件放到容器(這里指Tomcat)的Webapps文件夾下面,重新啟動容器,則會自動解壓安裝solr應用;
④在解壓出來的s ol r文件夾下建立一個名為conf 的文件夾,并且將下載的solr的multicore文件夾拷貝到conf文件夾下;
⑤重啟tomcat容器,輸入http://localhost:8080/ solr 出現solr界面表示已經成功安裝solr。
成功安裝solr之后,接下來要對solr的配置文件進行詳細配置,以滿足系統的需求。需要對solr的三個文件進行配置,分別為solr.xml、schema.xml 和solrconf ig.xml,下面分別詳細介紹這三個配置文件[5]。
solr.xml文件位于solr的conf 文件夾的主目錄下,主要是配置solr多core的功能,可以使得多core 獨立運行與solr服務器中,每個核都有獨立的配置文件。solr.xml文件的格式如表1所示。

表1 sorl.xml格式
上面的配置表示,該服務器中有三個獨立的core,分別為core0、core1和core2,并且它們的實例目錄是solr.xml所在目錄下的core0、core1和core2 目錄。
schema.xml配置文件主要是設定文檔的字段(field)以及字段查詢時的處理方式(filedtype),表2和表3分別描述了filed和filedtype這兩種元素。

表2 filed元素

表3 fieldtype元素
表2表示了文檔字段的設定格式,其中假設了三個字段,分別為id、name和size,
表3定義了string、boolean和complex三種類型,這些類型在上面的field定義中用到了,表示字段處理的類型。class表示類型處理的類,其中analyzer設置使用哪一種分詞方法。
solrconf ig.xml配置文件主要用于對solr服務器的系統參數進行配置。由于參數很多,所以不一一列舉介紹,只對比較基本的進行介紹。

表4 solr常用語法
據這些語法,可以通過http來進行簡單的solr查詢操作。這里只列出了一些常用的語法,其他語法可以自行查找。
用戶通過solrj可以實現訪問solr的服務[6],下面描述實現訪問的過程。
(1)創建鏈接solr服務器的句柄,配置相關參數。
String URL=http://127.0.0.1:8080/solr/core0;
Ht tpSol rServer sol rServer=new Ht tpSol r Server(URL);
solrServer.setSoTimeout(3000);
solrServer.setConnectionTimeout(1000);
solrServer.setFollowRedirects(false);
solrServer.setMaxRetries(1);
(2)清空solr索引服務器的索引。
solrServer.deleteByQuery(“:*”); solrServer.commit();
(3)添加索引。
sol rInputDocument doc1=new Sol rInput Document();
doc1.addField(“id”,”1”);
doc1.addField(“content”,”中國無線電事業,衛星通信系統”);
Collection docs = new ArrayList();
docs.add(doc1);
solrServer.add(docs);
solrServer.optimize();
solrServer.commit();
(4)搜索。
SolrQuery query1 = new SolrQuery();
query1.setQuery(“content:中國無線電”);
QueryResponse rsp=solrServer.query(query);
(5)關閉引用句柄。
solrServer.shutdown();
上面的步驟是使用solrj的最基本的方式,如果想要獲得更復雜的功能,可以對基本的API進行封裝定制相應的功能。
solr服務器自身對于分詞的處理能力不太理想,因此涉及到中文分詞的應用中,都需要對solr進行額外的中文分詞器的配置[7]。solr常用的分詞器有:ik中文分詞[8]、庖丁解牛[9]和mmseg4j[10]等。下面以ik中文分詞為例,來進行配置過程的介紹。
(1)在網上下載IK Analyzer 2012FF_hf1包,并且解壓。
(2)將IKAnalyzer2012FF_u1.jar包復制到tomcat /Webapps/solr/Web-INF/lib下面,并且在tomcat/Webapps/solr/Web-INF下面建立文件夾classes,再將IKAnalyzer.cfg.xml、stopword.dic 復制到classes文件夾下。
(3)修改tomcat/Webapps/solr/conf/multicore/ core0/conf/schema.xml,添加如表5配置;

表5 ik中文分詞配置
(4)對需要用ik分詞的字段的type修改為以上定義的name值type_ik。
(5)配置完成之后,重啟tomcat,即完成了分詞的配置。
圖2是solr搜索模塊的結構圖,其中索引服務與input模塊關聯,處理文檔建立索引入庫的工作;配置分詞指的是solr配置文件的配置和中文分詞的實現;搜索服務與search模塊關聯,處理用戶前臺搜索的工作,其中索引服務和搜索服務都是在solrAPI 的基礎上進行二次封裝,可以統稱為NEW API模塊,因此,可以按照功能將solr模塊分為配置文件的配置、中文分詞的實現和NEW API這三個模塊。下面分別介紹這三個模塊的實現。

圖2 solr全文搜索系統示意圖
配置文件包括schema.xml、solrconfig.xml和solr.xml。其中,solrconf ig.xml和solr.xml文件的配置方法參考3.2小節。
schema.xml文件的具體內容見表6。從表6中可以看出,需要兩個filetype: string和text。其中,text指明該類型需要用中文分詞進行分詞處理; field有兩個:filePath和content,類型分別為string 和text。filePath表示文檔的路徑,content表示文檔的全文內容,全文搜索在這個字段默認進行。

表6 schema.xml格式
中文分詞的配置實現過程參考上文第5節內容。
表7是INSEART API 對外接口方法列表,其中,initailize方法是進行初始化配置,連接solr服務器,成功返回TRUE,失敗返回FALSE;addIndex方法是添加建立索引,方法執行成功返回TRUE,失敗返回FALSE;searchDocuments 方法是查詢滿足條件的文檔,返回文檔集合;deleteIndex方法是刪除制定的索引,刪除成功返回TRUE,失敗返回FALSE。

表7 INSEART API對外接口方法表
本文詳細介紹了全文搜索引擎solr的配置以及設計實現,sorl全文搜索的最大的優勢在于可以按照用戶給出的關鍵詞自動在文檔庫中搜索所有的文檔內容,給出含有該關鍵詞的文檔,缺點是由于文檔的內容比較多所以搜索的速度比較慢,會影響用戶體驗。下一步的工作是,研究如何能夠提高sorl的搜索效率,進一步改善用戶體驗。