李建平,簡(jiǎn) 晨
(國(guó)家無(wú)線電監(jiān)測(cè)中心陜西監(jiān)測(cè)站,陜西 西安 710200)
Lucene是一個(gè)開放源代碼的全文檢索工具包但不是一個(gè)完整搜索引擎,僅提供了構(gòu)建搜索引擎的基礎(chǔ)架構(gòu),我們可以通過(guò)Lucene官網(wǎng)站下載該工具包,然后利用這個(gè)基礎(chǔ)架構(gòu)快速地開發(fā)出搜索引擎。Lucene的原作者是Doug Cutting,一位資深的全文檢索專家,最初將Lucene發(fā)表在自己的個(gè)人主頁(yè)上,2001年將Lucene捐獻(xiàn)給Apache,使得Lucene成為Jakarta的一個(gè)子項(xiàng)目[1]。
Luence的出現(xiàn)使得全文搜索得到了極大的發(fā)展,開發(fā)者不僅可以根據(jù)Luence的API開發(fā)搭建獨(dú)立的搜索引擎,而且還能夠?qū)⑺傻礁鞣N系統(tǒng)軟件以及商業(yè)軟件中,著名的商業(yè)軟件Eclipse的幫助文檔的搜索就是采用了Luence的API。
Luence作為全文搜索引擎,具有以下優(yōu)勢(shì)[2]:
⊙ Luence的索引文件是以8位字節(jié)為基礎(chǔ)的,使得可以兼容各種不同的平臺(tái)。
⊙ 在傳統(tǒng)的全文檢索引擎倒排索引的基礎(chǔ)上,實(shí)現(xiàn)了分塊索引,提升了索引速度。
⊙ 優(yōu)秀的面向?qū)ο蟮南到y(tǒng)架構(gòu),降低了開發(fā)人員的學(xué)習(xí)難度。
在上文中介紹了Lucence,開發(fā)人員可以利用API擴(kuò)展到自己的系統(tǒng)軟件中,但是這對(duì)于非專業(yè)的開發(fā)人員來(lái)說(shuō),要通過(guò)Lucence API來(lái)進(jìn)行開發(fā),難度還是很大,基于此,solr全文搜索引擎[3]應(yīng)運(yùn)而生,它很好地解決這個(gè)問題,使得Lucence在全文搜索領(lǐng)域得到進(jìn)一步的發(fā)展。
從圖1可以看出,solr是在Lucence java開源搜索包的基礎(chǔ)上實(shí)現(xiàn)的一個(gè)獨(dú)立的全文搜索引擎,可以獨(dú)立運(yùn)行在Servelet容器中。solr對(duì)用戶和開發(fā)者提供了兩種訪問接口,一種是HTTP訪問接口,通過(guò)solr自帶的簡(jiǎn)單的Web界面進(jìn)行交互,適合比較簡(jiǎn)單應(yīng)用,另一種是API接口,通過(guò)這些API開發(fā)者可以根據(jù)用戶需求定制搜索功能開發(fā)。
圖1 solr全文搜索架構(gòu)
solr配置使用過(guò)程[4]如下,建議JDK8.0,Tomcat7.0以上,solr選擇4.5版本以上。
①按照要求安裝JDK,配置成功環(huán)境變量;
②下載并且成功安裝Tomcat;
③解壓solr4.5,將solr.war文件放到容器(這里指Tomcat)的Webapps文件夾下面,重新啟動(dòng)容器,則會(huì)自動(dòng)解壓安裝solr應(yīng)用;
④在解壓出來(lái)的s ol r文件夾下建立一個(gè)名為conf 的文件夾,并且將下載的solr的multicore文件夾拷貝到conf文件夾下;
⑤重啟tomcat容器,輸入http://localhost:8080/ solr 出現(xiàn)solr界面表示已經(jīng)成功安裝solr。
成功安裝solr之后,接下來(lái)要對(duì)solr的配置文件進(jìn)行詳細(xì)配置,以滿足系統(tǒng)的需求。需要對(duì)solr的三個(gè)文件進(jìn)行配置,分別為solr.xml、schema.xml 和solrconf ig.xml,下面分別詳細(xì)介紹這三個(gè)配置文件[5]。
solr.xml文件位于solr的conf 文件夾的主目錄下,主要是配置solr多core的功能,可以使得多core 獨(dú)立運(yùn)行與solr服務(wù)器中,每個(gè)核都有獨(dú)立的配置文件。solr.xml文件的格式如表1所示。
表1 sorl.xml格式
上面的配置表示,該服務(wù)器中有三個(gè)獨(dú)立的core,分別為core0、core1和core2,并且它們的實(shí)例目錄是solr.xml所在目錄下的core0、core1和core2 目錄。
schema.xml配置文件主要是設(shè)定文檔的字段(field)以及字段查詢時(shí)的處理方式(filedtype),表2和表3分別描述了filed和filedtype這兩種元素。
表2 filed元素
表3 fieldtype元素
表2表示了文檔字段的設(shè)定格式,其中假設(shè)了三個(gè)字段,分別為id、name和size,
表3定義了string、boolean和complex三種類型,這些類型在上面的field定義中用到了,表示字段處理的類型。class表示類型處理的類,其中analyzer設(shè)置使用哪一種分詞方法。
solrconf ig.xml配置文件主要用于對(duì)solr服務(wù)器的系統(tǒng)參數(shù)進(jìn)行配置。由于參數(shù)很多,所以不一一列舉介紹,只對(duì)比較基本的進(jìn)行介紹。
表4 solr常用語(yǔ)法
據(jù)這些語(yǔ)法,可以通過(guò)http來(lái)進(jìn)行簡(jiǎn)單的solr查詢操作。這里只列出了一些常用的語(yǔ)法,其他語(yǔ)法可以自行查找。
用戶通過(guò)solrj可以實(shí)現(xiàn)訪問solr的服務(wù)[6],下面描述實(shí)現(xiàn)訪問的過(guò)程。
(1)創(chuàng)建鏈接solr服務(wù)器的句柄,配置相關(guān)參數(shù)。
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索引服務(wù)器的索引。
solrServer.deleteByQuery(“:*”); solrServer.commit();
(3)添加索引。
sol rInputDocument doc1=new Sol rInput Document();
doc1.addField(“id”,”1”);
doc1.addField(“content”,”中國(guó)無(wú)線電事業(yè),衛(wèi)星通信系統(tǒng)”);
Collection docs = new ArrayList();
docs.add(doc1);
solrServer.add(docs);
solrServer.optimize();
solrServer.commit();
(4)搜索。
SolrQuery query1 = new SolrQuery();
query1.setQuery(“content:中國(guó)無(wú)線電”);
QueryResponse rsp=solrServer.query(query);
(5)關(guān)閉引用句柄。
solrServer.shutdown();
上面的步驟是使用solrj的最基本的方式,如果想要獲得更復(fù)雜的功能,可以對(duì)基本的API進(jìn)行封裝定制相應(yīng)的功能。
solr服務(wù)器自身對(duì)于分詞的處理能力不太理想,因此涉及到中文分詞的應(yīng)用中,都需要對(duì)solr進(jìn)行額外的中文分詞器的配置[7]。solr常用的分詞器有:ik中文分詞[8]、庖丁解牛[9]和mmseg4j[10]等。下面以ik中文分詞為例,來(lái)進(jìn)行配置過(guò)程的介紹。
(1)在網(wǎng)上下載IK Analyzer 2012FF_hf1包,并且解壓。
(2)將IKAnalyzer2012FF_u1.jar包復(fù)制到tomcat /Webapps/solr/Web-INF/lib下面,并且在tomcat/Webapps/solr/Web-INF下面建立文件夾classes,再將IKAnalyzer.cfg.xml、stopword.dic 復(fù)制到classes文件夾下。
(3)修改tomcat/Webapps/solr/conf/multicore/ core0/conf/schema.xml,添加如表5配置;
表5 ik中文分詞配置
(4)對(duì)需要用ik分詞的字段的type修改為以上定義的name值type_ik。
(5)配置完成之后,重啟tomcat,即完成了分詞的配置。
圖2是solr搜索模塊的結(jié)構(gòu)圖,其中索引服務(wù)與input模塊關(guān)聯(lián),處理文檔建立索引入庫(kù)的工作;配置分詞指的是solr配置文件的配置和中文分詞的實(shí)現(xiàn);搜索服務(wù)與search模塊關(guān)聯(lián),處理用戶前臺(tái)搜索的工作,其中索引服務(wù)和搜索服務(wù)都是在solrAPI 的基礎(chǔ)上進(jìn)行二次封裝,可以統(tǒng)稱為NEW API模塊,因此,可以按照功能將solr模塊分為配置文件的配置、中文分詞的實(shí)現(xiàn)和NEW API這三個(gè)模塊。下面分別介紹這三個(gè)模塊的實(shí)現(xiàn)。
圖2 solr全文搜索系統(tǒng)示意圖
配置文件包括schema.xml、solrconfig.xml和solr.xml。其中,solrconf ig.xml和solr.xml文件的配置方法參考3.2小節(jié)。
schema.xml文件的具體內(nèi)容見表6。從表6中可以看出,需要兩個(gè)filetype: string和text。其中,text指明該類型需要用中文分詞進(jìn)行分詞處理; field有兩個(gè):filePath和content,類型分別為string 和text。filePath表示文檔的路徑,content表示文檔的全文內(nèi)容,全文搜索在這個(gè)字段默認(rèn)進(jìn)行。
表6 schema.xml格式
中文分詞的配置實(shí)現(xiàn)過(guò)程參考上文第5節(jié)內(nèi)容。
表7是INSEART API 對(duì)外接口方法列表,其中,initailize方法是進(jìn)行初始化配置,連接solr服務(wù)器,成功返回TRUE,失敗返回FALSE;addIndex方法是添加建立索引,方法執(zhí)行成功返回TRUE,失敗返回FALSE;searchDocuments 方法是查詢滿足條件的文檔,返回文檔集合;deleteIndex方法是刪除制定的索引,刪除成功返回TRUE,失敗返回FALSE。
表7 INSEART API對(duì)外接口方法表
本文詳細(xì)介紹了全文搜索引擎solr的配置以及設(shè)計(jì)實(shí)現(xiàn),sorl全文搜索的最大的優(yōu)勢(shì)在于可以按照用戶給出的關(guān)鍵詞自動(dòng)在文檔庫(kù)中搜索所有的文檔內(nèi)容,給出含有該關(guān)鍵詞的文檔,缺點(diǎn)是由于文檔的內(nèi)容比較多所以搜索的速度比較慢,會(huì)影響用戶體驗(yàn)。下一步的工作是,研究如何能夠提高sorl的搜索效率,進(jìn)一步改善用戶體驗(yàn)。