蔡宇晶,孫玫肖,朱建軍
(1.中國鐵道科學(xué)研究院,北京 100081;2.中國鐵道科學(xué)研究院 電子計算技術(shù)研究所,北京 100081)
Solr在樂齡易購網(wǎng)站中的應(yīng)用
蔡宇晶1,孫玫肖2,朱建軍2
(1.中國鐵道科學(xué)研究院,北京 100081;2.中國鐵道科學(xué)研究院 電子計算技術(shù)研究所,北京 100081)
為了提高樂齡易購網(wǎng)站的搜索效率,對不同搜索服務(wù)器進行了功能性對比,選擇了擁有快速高效全文搜索功能的Solr作為網(wǎng)站搜索服務(wù)器,對其原理和特性進行了分析,并對其在樂齡易購網(wǎng)站中的配置和應(yīng)用進行了介紹。通過配置Solr建立索引文件結(jié)構(gòu),改變了網(wǎng)站從數(shù)據(jù)庫直接訪問數(shù)據(jù)的查詢形式,解決了網(wǎng)站用戶搜索緩慢的問題,為電商平臺實現(xiàn)高效搜索服務(wù)提供了一種模式。
Solr搜索服務(wù)器;數(shù)據(jù);索引
樂齡易購網(wǎng)站是一個老年旅游電子商務(wù)平臺,作為一個電商網(wǎng)站,用戶需要在網(wǎng)站主頁根據(jù)關(guān)鍵字進行產(chǎn)品搜索。傳統(tǒng)的搜索方式是直接從數(shù)據(jù)庫中實現(xiàn)字段查詢,這種查詢方式效率較低,當(dāng)用戶搜索量較大時會造成搜索速率下降,影響用戶的使用體驗。為了解決這一問題,提高網(wǎng)站的搜索效率,本文進行了探討并給出解決方案。
1.1 樂齡易購網(wǎng)站概述
樂齡易購網(wǎng)站擁有老年旅游和異地(旅游)養(yǎng)老等核心產(chǎn)品,同時提供新聞資訊、訂單處理、在線支付、旅游點評、會員中心等內(nèi)容。樂齡易購網(wǎng)站使用Broadleaf作為項目開發(fā)框架,Broadleaf是一個開源的電子商務(wù)平臺,基于Spring 框架開發(fā),提供一個可靠、可擴展的架構(gòu),能夠進行深度的定制和快速開發(fā)。
1.2 網(wǎng)站面臨的問題
隨著互連網(wǎng)的迅速發(fā)展,Web信息量成指數(shù)倍增長,如何快速、準確地從如此龐大的信息庫中獲取自己需要的信息,成為互聯(lián)網(wǎng)用戶面臨的一個重要問題。
樂齡易購網(wǎng)站作為一個電商網(wǎng)站,需要用戶在主頁進行產(chǎn)品搜索。產(chǎn)品數(shù)據(jù)一開始是直接從數(shù)據(jù)庫訪問的,這樣設(shè)置可以實現(xiàn)功能需求,但搜索時效不高,用戶需要等待的時間很長,會影響用戶使用網(wǎng)站的整體感受。提高搜索效率,改善用戶體驗,增加網(wǎng)站的可用性是必須要解決的問題。
1.3 搜索服務(wù)器的選擇
使用搜索服務(wù)器能夠提高搜索效率,當(dāng)前主流的搜索服務(wù)器有Solr、Elasticsearch和Sphinx等。
3種搜索引擎在技術(shù)上各有優(yōu)缺點,而網(wǎng)站搜索服務(wù)器的選擇,除了要充分考慮其技術(shù)成熟度和搜索效率外,還需權(quán)衡電商平臺搜索數(shù)據(jù)規(guī)模量以及網(wǎng)站開發(fā)語言與搜索服務(wù)器的兼容度。
Sphinx是基于SQL的全文檢索服務(wù)器,支持比數(shù)據(jù)庫本身更加專業(yè)的搜索功能,能夠方便地與SQL數(shù)據(jù)庫進行集成,其索引無法進行動態(tài)添加。在中文分詞方面,Sphinx目前只支持sphinx for chinese和mmseg3兩種分詞。
Elasticsearch是一個實時的分布式多用戶搜索引擎,用于全文搜索及分析,基于Lucene實現(xiàn)。Elasticsearch更適用于數(shù)據(jù)規(guī)模較大的檢索,其優(yōu)勢在于實時導(dǎo)入搜索,但在傳統(tǒng)搜索數(shù)據(jù)方面性能較差。
Solr擁有快速全面的搜索功能,其開發(fā)基于Java語言,可以很方便的嵌入到Java應(yīng)用程序中(本文所闡述的樂齡易購電商平臺基于Java語言開發(fā)),擴展性強。Solr提供field collapsing (分組查詢)來避免類似搜索結(jié)果的重復(fù)性,而Sphinx做不到。Solr是提供極快的搜索目錄的行業(yè)領(lǐng)導(dǎo)者,在對已有數(shù)據(jù)進行搜索時,Solr搜索效率明顯強于Elasticsearch。Solr基于開放接口的標準,能夠提供相對豐富的查詢功能,除了基本的查詢,還包括分組,排序及統(tǒng)計等功能。除此之外,Solr擁有高級的全文搜索功能,能夠在網(wǎng)絡(luò)流通量相對大的情況下進行優(yōu)化,并且提供監(jiān)控日志,極大地提高了網(wǎng)站站內(nèi)搜索的效率,能夠快速查詢到用戶所輸入的查詢信息。
基于上述原因,樂齡易購網(wǎng)站選擇了Solr作為網(wǎng)站的搜索服務(wù)器。
Solr是一個開源的搜索服務(wù)器,它能夠提供類似Web服務(wù)的API接口。用戶按照相應(yīng)格式要求配置xml文件,通過http請求將配置好的xml文件提交到服務(wù)器,從而創(chuàng)建索引。Solr開發(fā)通過 Java 語言,框架源于Lucene并在其基礎(chǔ)上進行了擴展。存儲在Solr中的資源均以document(文檔)為對象,每一個document由一系列的field(字段)構(gòu)成,每一個field 可以用來代表所存儲資源的屬性。Solr目前是一個比較成熟穩(wěn)定的搜索引擎,已經(jīng)被一些大型的網(wǎng)站所使用。
2.1 Solr特性
Solr具有高效、靈活的緩存功能,能夠高亮顯示搜索結(jié)果,特性包括以下幾點:
(1)高級的全文搜索功能;
(2)基于開放接口的標準;
(3)可伸縮性-能夠有效地復(fù)制到另外一個Solr搜索服務(wù)器;
(4)使用xml配置達到靈活性和適配性。
2.2 Solr原理
對于數(shù)據(jù)索引的增刪改查,Solr提供了一種可實現(xiàn)的通用http接口。具體原理如下:用戶向部署在servlet 容器中的Solr Web 應(yīng)用程序發(fā)送http請求,啟動索引和搜索,Solr接受請求并確定所需的SolrRequestHandler,處理相關(guān)請求后http以相同的方式返回響應(yīng)。
3.1 配置方法
Solr保持高效運行需要考慮很多因素,通常認為Solr里最重要的配置文件就是schema.xml ,solrconfig.xml。
3.1.1 模式配置schema.xml
schema.xml類似于數(shù)據(jù)表配置文件,是業(yè)務(wù)邏輯的核心。定義一個文檔會包含什么字段、字段如何索引等都是在schema中完成的。模式配置主要分為types部分、fields部分以及其他一些缺省設(shè)置。
(1)types 配置
<types〉部分是一些常用的可重用定義,用于聲明Solr如何處理 field,以及這個field如何處理查詢。
需要在types節(jié)點內(nèi)定義一個fieldType子節(jié)點,同時聲明name,class等一些參數(shù)。name是一個標識,即這個fieldType的名稱,<field〉中的type引用的就是這個name;class確定此fieldType的實際行為。
在對fieldType進行定義時,定義這個fieldType類型的數(shù)據(jù)在生成索引和搜索查詢時所需使用的分析器analyzer十分重要,使用不同的analyzer可以對這個fieldType的數(shù)據(jù)進行不同處理,比如中文切詞、刪除空白等。分析器需要定義分詞器和過濾器,analyzer type="index"表示生成索引時使用的分詞器及過濾器,analyzer type="query"表示搜索查詢時所使用的分詞器及過濾器,以analyzer type="inder"為例:
<fieldType name="text_general"class="solr.Text Field"positionIncrementGap="100"〉
<analyzer type="index"〉
<tokenizer class="solr.StandardTokenizerFactory" /〉--定義分詞器
<filter class="solr.LowerCaseFilterFactory" /〉--定義過濾器
</analyzer〉
(2)fileds配置
在fields節(jié)點內(nèi)定義具體的字段,即模式的<fields〉部分,是添加到索引文件中出現(xiàn)的屬性名稱。
field是固定的字段設(shè)置,聲明field包含name、字段類型名;type即之前定義過的各種fieldType;indexed代表是否需要建立索引以方便之后對該字段進行查詢,該值置為true時表示數(shù)據(jù)應(yīng)被搜索排序;stored代表是否需要隨索引存儲該字段內(nèi)容,該值置為true時表示在正常情況下搜索結(jié)果中會包括這個字段。
當(dāng)有太多字段無法一一進行設(shè)定時,需要使用動態(tài)字段dynamicField屬性,即不制定具體名稱,僅定義字段名稱的規(guī)則,如下:
<dynamicField name="*_i" type="int" indexed="true" stored="true" /〉
*號是通配符,*_i表示定義所有以_i做結(jié)尾的字段。
(3)其他配置
schema.xml 文件最后部分聲明了一些其他配置。
在設(shè)計數(shù)據(jù)庫的表結(jié)構(gòu)時會為表建立唯一索引來標識表中數(shù)據(jù)的唯一性,同樣schema配置也需要一個唯一標識符uniquekey,這個字段必須填寫,否則索引可能會報錯;schema配置時一般會配置搜索字段,如果沒有搜索字段時就需要用到默認搜索字段defaultSearchField;copyField復(fù)制字段,可以將多個字段值復(fù)制至一個字段,當(dāng)多種方式索引相同內(nèi)容時可以使用復(fù)制字段。
3.1.2 solrconfig.xml 配置
solrconfig.xml 文件大部分的參數(shù)是用來配置Solr本身的,指定了Solr如何處理索引、突出顯示、分類、搜索以及其他請求。solrconfig.xml分為索引配置和查詢配置。
3.2 在網(wǎng)站中實現(xiàn)全文檢索
Solr在實現(xiàn)全文檢索時一般分為兩大流程:(1)創(chuàng)建索引(Indexing);(2)搜索索引(Search)。傳統(tǒng)的數(shù)據(jù)庫都是由文檔id來映射文檔中的關(guān)鍵字,而Solr采用的是反向索引,反向索引就是從關(guān)鍵字到文檔的映射過程,關(guān)鍵字可以在內(nèi)容分析時隨時添加、刪除或修改。
3.2.1 創(chuàng)建索引
原始文檔需要被交給分詞組件進行中文分詞,用戶使用網(wǎng)站在前臺進行搜索時,搜索時間很慢會影響網(wǎng)站用戶體驗,因此需要合適的分詞組件。Solr默認提供的分詞組件進行中文分詞時效果十分不理想,當(dāng)fieldType選擇“text_general”(即Solr默認分詞組件)為分詞依據(jù)時,輸入中文“選擇一條旅游線路”進行分詞,觀察到分詞效果如圖1所示。
圖1 Solr默認分詞組件分詞效果
此時的分詞是將句子按字依次隔開,分詞模式效率很低,搜索時需要一個個去索引包含這些漢字的全部文檔,做交叉“與”運算,即包含這些字并且位置連續(xù)的文檔才是能滿足需求的結(jié)果,搜索時效將會十分緩慢。運行這樣的索引結(jié)構(gòu),用戶搜索時需要等待很長時間,而且對硬件和算法都是極大的挑戰(zhàn)。運用中文分詞檢索可以解決這個問題,詞是漢語中最小的一種語義單位,當(dāng)搜索引擎索引的key值以詞為單位時,會大幅度的提高該引擎搜索結(jié)果的準確性,同時也可以保證在搜索過程中保持相對較小的計算量。比較常用的能夠和Solr集成的中文分詞組件有以下幾種,mmseg4j、Paoding、IkAnalyzer等等,這些分詞組件各有各的特點,用戶可以選擇最適合自己的。本電商網(wǎng)站選用的組件是mmseg4j。將其下載安裝之后,需要修改配置文件schema.xml,添加如下代碼:
配置完成后檢查一下mmseg4j分詞的效果,再次輸入“選擇一條旅游線路”,能夠看見分詞效果如圖2所示。
圖2 中文分詞組件配置后分詞效果
現(xiàn)在的分詞基本符合正常語義,較之前效果優(yōu)化了許多,提高了搜索效率,用戶搜索時的體驗度會更好。
分好的詞匯單元會被傳給語言處理組件,語言處理組件對得到的詞元做一些語言相關(guān)的處理,將得到的詞傳遞給索引組件,索引創(chuàng)建完成。
3.2.2 搜索索引
索引創(chuàng)建完畢后用戶可以找到需要的文檔,如果找到的結(jié)果數(shù)量很龐大,讓用戶去一一篩選顯然不可行。從用戶體驗感出發(fā),需要運用搜索索引在大量的文檔中找到最相關(guān)的文檔進行排序。
搜索索引先對查詢內(nèi)容進行詞法分析、語法分析、語言處理,得到一個查詢樹,之后通過索引存儲將索引讀到內(nèi)存,再利用查詢樹來搜索索引,從而得到每個詞的相關(guān)文檔鏈表,對文檔鏈表進行判斷并得到結(jié)果文檔,根據(jù)查詢語句與文檔的相關(guān)性,對查詢結(jié)果進行篩選排序,使用戶得到一個相對滿意的結(jié)果。
Solr搜索服務(wù)器擁有快速高效全面的全文搜索功能,能夠與多種中文分詞組件進行集成。在樂齡易購網(wǎng)站中,通過配置Solr建立一個索引文件結(jié)構(gòu)匹配相關(guān)規(guī)則,根據(jù)文檔的字段id來唯一標識文檔數(shù)據(jù),改變了網(wǎng)站從數(shù)據(jù)庫直接訪問數(shù)據(jù)的查詢形式,解決了用戶搜索緩慢的問題,實現(xiàn)了網(wǎng)站數(shù)據(jù)的高效搜索。
[1]Trey Grainger,Timothy Potter.Solr in Action[M].Manning Publications,2014.
[2]David Smiley,Eric Pugh.Apache Solr 3 Enterprise Search Server[M].Packt Publishing,2011.
[3]Wikipedia:Solr[DB/OL].https://no.wikipedia.org/wiki/Solr.
[4]劉建國,黃厚寬.使用分類和聚類提高搜索引擎的可用性[J].鐵路計算機應(yīng)用 ,2006,15(3):44-46.
[5]李戴維,李 寧.基于Solr的分布式全文檢索系統(tǒng)的研究與實現(xiàn)[J].計算機與現(xiàn)代化,2012(11):171-176.
責(zé)任編輯 付 思
Application of Solr in Lelingyigou Website
CAI Yujing1,SUN Meixiao2,ZHU Jianjun2
( 1.China Academy of Railway Sciences,Beijing 100081,China;2.Institute of Computing Technologies,China Academy of Railway Sciences,Beijing 100081,China)
In order to improve the search effciency,through the functional comparison of different search server,this article chose the Solr as the website search server.The Solr processes the efficient and comprehensive fulltext search capabilities.The article analyzed the principles and characteristic of the Solr,introduced the confguring and application of the Solr in Lelingyigou Website,By deploying the Solr to index file structure,it was changed the website’s inquiry form that accesses the database directory,and solved the problem of low searching speed,and provided a model for the e-commerce platform to implement high effcient search service.
Solr search server;data;index
TP39
A
1005-8451(2016)10-0053-04
2016-01-22
蔡宇晶,在讀碩士研究生;孫玫肖,研究員。