柳帆
(西南交通大學(xué)制造業(yè)產(chǎn)業(yè)鏈協(xié)同與信息化支撐技術(shù)四川省重點(diǎn)實(shí)驗(yàn)室,成都 611756)
近年來(lái),隨著科技行業(yè)的不斷發(fā)展與進(jìn)步,科技資源數(shù)據(jù)信息量急劇增加,從浩如煙海的、不同結(jié)構(gòu)的科技資源中快速精確地找到用戶所需要的信息,傳統(tǒng)的數(shù)據(jù)庫(kù)檢索顯得力不從心[1]。ElasticSearch已解決多個(gè)行業(yè)的海量數(shù)據(jù)分布式搜索引擎建設(shè)方案,但科技資源領(lǐng)域在ElasticSearch分布式搜索方面未涉及到公開(kāi)的報(bào)道。
文獻(xiàn)《基于ElasticSearch的氣象數(shù)據(jù)檢索技術(shù)研究》給出了對(duì)氣象行業(yè)的ElasticSearch分布式搜索引擎建設(shè)方案[2],文獻(xiàn)《基于ElasticSearch的元數(shù)據(jù)搜索與共享平臺(tái)》使用ElasticSearch建立了水利行業(yè)的數(shù)據(jù)搜索與共享平臺(tái)[3],文獻(xiàn)《ElasticSearch分布式搜索引擎在天文大數(shù)據(jù)檢索中的應(yīng)用研究》對(duì)天文大數(shù)據(jù)的檢索進(jìn)行了應(yīng)用研究[4]。由此可見(jiàn),ElasticSearch分布式搜索技術(shù)在海量數(shù)據(jù)的管理與搜索中具有可行性和實(shí)踐性。因此,為了改善用戶搜索體驗(yàn),提高檢索的效率和質(zhì)量,本文提出了基于ElasticSearch的科技資源分布式搜索引擎的構(gòu)建方案并對(duì)檢索系統(tǒng)進(jìn)行了實(shí)現(xiàn),最終通過(guò)實(shí)驗(yàn)數(shù)據(jù)檢測(cè),能較好地解決不斷增長(zhǎng)的科技資源數(shù)據(jù)檢索的需求。
Lucene[5]是一個(gè)開(kāi)源、穩(wěn)定、高性能、基于Java開(kāi)發(fā)的全文檢索引擎架構(gòu),相比較于關(guān)系型數(shù)據(jù)庫(kù),Lucene采用倒排索引實(shí)現(xiàn)了更加高效的搜索性能。Lucene不是一個(gè)完整的搜索引擎,不具備具體的搜索功能模塊,開(kāi)發(fā)者需要對(duì)Lucene進(jìn)行二次開(kāi)發(fā)以實(shí)現(xiàn)搜索功能和擴(kuò)展其他各種功能。Lucene是一個(gè)出色的全文檢索工具庫(kù),基本能滿足所有場(chǎng)景下的全文檢索需求。許多著名的項(xiàng)目都采用Lucene作為搜索工具,例如IBM的WebSphere和Eclipse都利用Lucene作為全文搜索引擎。
ElasticSearch[6-8]是基于Lucene構(gòu)建的分布式全文檢索和分析引擎,具備高性能、高可擴(kuò)展、實(shí)時(shí)性等優(yōu)點(diǎn)。ElasticSearch對(duì)Lucene進(jìn)行了封裝,屏蔽了Lucene框架的復(fù)雜性,開(kāi)發(fā)者使用簡(jiǎn)單RESTful API就可以操作全文檢索。和傳統(tǒng)的數(shù)據(jù)庫(kù)相比,ElasticSearch還有如下特點(diǎn):
(1)使用倒排索引存儲(chǔ)結(jié)構(gòu)。把文件ID到關(guān)鍵詞的映射轉(zhuǎn)為關(guān)鍵詞到文件ID的映射,根據(jù)單詞出現(xiàn)頻率,結(jié)合TF-IDF算法計(jì)算相關(guān)度評(píng)分,將評(píng)分高的搜索結(jié)果優(yōu)先展示給用戶。
(2)分片存儲(chǔ)。存儲(chǔ)文檔時(shí),利用哈希算法計(jì)算文檔的ID值,接著按照文檔的ID值存到對(duì)應(yīng)的主分片上,然后復(fù)制主分片的數(shù)據(jù)到多個(gè)復(fù)制分片。因此,當(dāng)有某臺(tái)服務(wù)器宕機(jī)時(shí)數(shù)據(jù)不會(huì)丟失,保證了ElasticSearch的高可用與高吞吐。
(3)橫向可擴(kuò)展??梢暂p松的擴(kuò)容至數(shù)以百計(jì)的服務(wù)器,支持PB級(jí)別的結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)處理,用于海量數(shù)據(jù)的分布式存儲(chǔ)、搜索和實(shí)時(shí)分析,能滿足大數(shù)據(jù)時(shí)代下的分布式搜索需求。
目前,ElasticSearch是企業(yè)級(jí)大數(shù)據(jù)解決方案的首選工具之一,并且已經(jīng)有許多成功的使用案例,Github、維基百科、百度、阿里巴巴等企業(yè)都已大規(guī)模部署及應(yīng)用,如圖1展示了ElasticSearch總體架構(gòu)。
圖1 ElasticSearch的總體架構(gòu)
(1)GateWay是ElasticSearch的文件系統(tǒng),用于存儲(chǔ)索引。它支持不同的存儲(chǔ)方式,本地文件系統(tǒng)、分布式文件系統(tǒng)以及AmazonS3云平臺(tái)等都可以用于索引的存儲(chǔ)。
(2)Distributed Lucene Directory是分布式的Lucene框架,它在GateWay的上一層,是ElasticSearch的核心實(shí)現(xiàn)層,ElasticSearch集群的每個(gè)節(jié)點(diǎn)都有一個(gè)Lucene-core的支持。
(3)Function layer是ElasticSearch的功能層,提供了索引創(chuàng)建、數(shù)據(jù)搜索和映射三大核心功能。
(4)Discovery是ElasticSearch的發(fā)現(xiàn)模塊,主要用于在集群內(nèi)選取主節(jié)點(diǎn),然后完成節(jié)點(diǎn)間的信息傳輸。Scripting用于支持JavaScript、Python等語(yǔ)言對(duì)ElasticSearch的操作;同時(shí)ElasticSearch也支持第三方插件3rdPlugins,比如中文分詞插件以及可視化操作插件。
(5)Transport是傳輸層,借助HTTP進(jìn)行傳輸;JVM主要用于管理ElasticSearch集群的應(yīng)用。
(6)RESTful Style API是用戶接口層,主要用于支持用戶與ElasticSearch集群的交互。
在自然語(yǔ)言中,詞是最小的、不可分割的數(shù)據(jù),中文繼承自古代漢語(yǔ)的傳統(tǒng),詞語(yǔ)之間沒(méi)有明顯區(qū)分標(biāo)記,不能以單個(gè)漢字分詞,不像英文以空格作為天然的分隔,因此必須引入中文分詞。中文分詞是中文信息處理的首要前提,是搜索引擎的精確性的根本保障,中文分詞的精確與否,將對(duì)搜索結(jié)果的相關(guān)性排序產(chǎn)生直接影響。目前在中文分詞領(lǐng)域,主要采用三種分詞方法:字符串匹配分詞法、理解分詞法和統(tǒng)計(jì)分詞法[9]。
(1)字符串匹配分詞法。根據(jù)特定的策略將要分詞的字符串與詞典中的詞匹配,如果能在詞典找到說(shuō)明匹配成功。匹配方式分為正向匹配、逆向匹配、最長(zhǎng)匹配、最短匹配、單純分詞、分詞與標(biāo)注相結(jié)合這六種,前兩種是通過(guò)掃描方向劃分,中間兩種是通過(guò)長(zhǎng)度劃分,后兩種是通過(guò)是否與詞性標(biāo)注相結(jié)合劃分。
(2)理解分詞法。模擬人對(duì)句子的理解過(guò)程,在分詞的過(guò)程中實(shí)現(xiàn)對(duì)句法以及語(yǔ)義的分析,再通過(guò)句法信息以及語(yǔ)義信息對(duì)分詞定界。
(3)統(tǒng)計(jì)分詞法。計(jì)算相連的字在不同的文本中出現(xiàn)的頻率,按照頻率判斷是不是一個(gè)詞。目前,研究分詞技術(shù)的前沿團(tuán)隊(duì)在技術(shù)實(shí)現(xiàn)細(xì)節(jié)方面都非常保密。要開(kāi)發(fā)一個(gè)分詞準(zhǔn)確率高、分詞速度快的中文分詞系統(tǒng),依靠個(gè)體是一個(gè)漫長(zhǎng)的過(guò)程。因此,在具體的實(shí)現(xiàn)過(guò)程中,一般采用開(kāi)源的中文分詞器來(lái)完成分詞工作。
Logstash[10]作為一個(gè)開(kāi)源的數(shù)據(jù)搜索引擎,擁有實(shí)時(shí)管道功能和強(qiáng)大的數(shù)據(jù)處理能力。Logstash可以動(dòng)態(tài)整合分散的數(shù)據(jù)源,并根據(jù)選擇標(biāo)準(zhǔn)化數(shù)據(jù)到指定位置,實(shí)現(xiàn)數(shù)據(jù)的收集、轉(zhuǎn)換與輸出,其數(shù)據(jù)處理流程分為三個(gè)模塊。
(1)Input輸入模塊。從數(shù)據(jù)源獲取數(shù)據(jù);
(2)Filter過(guò)濾模塊。對(duì)數(shù)據(jù)進(jìn)行處理,比如格式轉(zhuǎn)換、數(shù)據(jù)派生以及增強(qiáng)等;
(3)Output輸出模塊。將數(shù)據(jù)輸出到指定到位置進(jìn)行存儲(chǔ)。
目前主要的中文分詞器包括:Standard-Analyzer、CJKAnalyzer、MMSeg4j、Smartcn、IKAnalyzer[11-12],下面從分詞準(zhǔn)確性和分詞速率兩個(gè)方面對(duì)上述中文分詞器進(jìn)行分析。
(1)使用測(cè)試用例“2017年7月1日,慶祝香港回歸祖國(guó)20周年大會(huì)暨香港特別行政區(qū)第五屆政府就職典禮在香港會(huì)展中心隆重舉行”來(lái)測(cè)試分詞的準(zhǔn)確性,并進(jìn)行分析和比較,如表1所示。
表1 中文分詞比較
從表1可以看出,采用一元分詞的StandardAnalyzer和采用二元分詞的CJKAnalyzer,其分詞結(jié)果都不夠準(zhǔn)確,并且會(huì)產(chǎn)生過(guò)多索引碎片,從而降低檢索的準(zhǔn)確率。Smartcn分詞器、MMSeg4j分詞器和IKAnalyzer分詞器采用詞庫(kù)分詞,分詞準(zhǔn)確率更高,其中IKAnalyzer分詞效果最為理想。
(2)利用分詞速率比較中文分詞器的性能。為了避免開(kāi)發(fā)環(huán)境對(duì)實(shí)驗(yàn)結(jié)果的影響,本文在相同的實(shí)驗(yàn)環(huán)境比較相對(duì)值,使用上述中文分詞器對(duì)SIGHANBakeoff 2005 PKU數(shù)據(jù)集(510KB),以及10M文本數(shù)據(jù)進(jìn)行分詞,評(píng)測(cè)結(jié)果如表2所示。
表2 中文分詞時(shí)間比較
盡管StandardAnalyzer、CJKAnalyzer、Smartcn的分詞速率比較快,但是分詞可靠性不高,而IKAnalyzer的分詞速率比MMSeg4j快。結(jié)合多種因素,可以得出:IKAnalyzer是本文首選的中文分詞器。
結(jié)合數(shù)據(jù)規(guī)模、性能和功能需求,基于ElasticSearch的科技資源檢索系統(tǒng)分為數(shù)據(jù)導(dǎo)入、數(shù)據(jù)索引、數(shù)據(jù)檢索、緩存四個(gè)模塊。首先用Logstash將MySQL中的標(biāo)準(zhǔn)化數(shù)據(jù)導(dǎo)入到ElasticSearch,當(dāng)用戶發(fā)送搜索請(qǐng)求時(shí),SpringBoot通過(guò)ElasticSearch官方提供的JavaAPI調(diào)用Elasticsearch實(shí)現(xiàn)數(shù)據(jù)的檢索,最后用VUE框架對(duì)搜索結(jié)果進(jìn)行前端展示。此外,對(duì)于用戶信息、用戶熱搜資源和平臺(tái)熱搜資源等信息通過(guò)SpringBoot存放到Redis數(shù)據(jù)庫(kù)中,以便進(jìn)一步提高系統(tǒng)的性能,系統(tǒng)的總體架構(gòu)如圖2所示。
圖2 系統(tǒng)總體架構(gòu)
本系統(tǒng)中科技資源數(shù)據(jù)經(jīng)過(guò)匯聚、清洗、篩選和標(biāo)準(zhǔn)化之后,會(huì)存入MySQL數(shù)據(jù)庫(kù)中,然后利用Logstash工具將資源數(shù)據(jù)從MySQL數(shù)據(jù)庫(kù)同步到ElasticSearch中,Logstash詳細(xì)配置如下:
input{
stdin{}
jdbc{
jdbc_connection_string => “jdbc: mysql://192.168.2.116.3306/gl3?serverTimezone=CTT”
jdbc_user=>“root”
jdbc_password=>“root”
jdbc_driver_library => “/es/logstash/mysqlconnet/mysql-connector-java-8.0.11.jar”
jdbc_driver_class=>“cool.mysql.cj.jdbc.Driver”
jdbc_paging_enabled=>“true”
jdbc_page_size=>“5000”
schedule=>”1”
type=>“synthetical”
}
}
filter{
json{
source=>“message”
target=>“msg_json”
}
grok{
match=>{"message"=>"%{COMBINEDAPACHE-LOG}"}
}
}
output{
if[type]==“synthetical”{
elasticsearch{
hosts=>“192.168.2.247:9201”
index=>”synthetical”
document_id=>“%{id}”
template_overwrite=>true
manage_template=>true
template=>“/es/logstash/template/logstah
ik.json”
template_name=>“synthetical-ik”
}
}s
tdout{
codec=>json_lines
}
}
2.4.1 中文分詞的實(shí)現(xiàn)
IKAnalyzer是一個(gè)開(kāi)源、基于Java實(shí)現(xiàn)的輕量級(jí)中文分詞工具包,支持多種分析處理模式,采用了“正向迭代最細(xì)粒度切分”算法[13],具有高速的數(shù)據(jù)處理能力。本文采用IKAnalyzer中文分詞系統(tǒng)作為中文分詞模塊的主要組件,在ElasticSearch中配置IKAnalyzer中文分詞插件的過(guò)程如下:
(1)下載IKAnalyzer源碼,接著執(zhí)行命令mvncleanpackage,打包得到j(luò)ar包文件。
(2)將IKAnalyzer依賴包復(fù)制到elasticsearch/plugin/analysis-ik目錄下。
(3)在Elasticsearch的config目 錄 下 對(duì)IKAnalyzer進(jìn)行相關(guān)配置,配置文件elasticsearch.yml添加的內(nèi)容如下:
index:
a
nalysis:
analyzer:
ik_syno:
alias:[ik_max_word]
type:custom
tokenizer:ik
use_smart:false
filter:[synonym]
ik_smart_syno:
type:custom
tokenizer:ik_smart_tok
user_smart:true
filter:[synonym]
ik:
type:ik
use_smart:true
ik_smart:
type:ik
use_smart:true
filter:
synonym:
type:synonym
ignore_case:true
synonyms_path:ik/custom/synon-ym.
dic
index.analysis.analyzer.default.type:ik
2.4.2 索引的實(shí)現(xiàn)
Elasticsearch是基于Lucene實(shí)現(xiàn)的,采用倒排索引的方式存儲(chǔ)數(shù)據(jù)[14]。首先從存放標(biāo)準(zhǔn)數(shù)據(jù)的MySQL數(shù)據(jù)庫(kù)中獲取數(shù)據(jù),然后通過(guò)分詞器解析生成多個(gè)字段(field),接著構(gòu)建文檔(document),最后用IndexWrite建立索引并將信息放入索引庫(kù)中。索引庫(kù)包含文檔號(hào)、詞頻、位置和偏移量等信息,其實(shí)現(xiàn)流程如圖3所示。
圖3 索引的實(shí)現(xiàn)流程圖
2.5.1 檢索的實(shí)現(xiàn)
用戶輸入查詢關(guān)鍵字,系統(tǒng)將關(guān)鍵字與ElasticSearch索引庫(kù)中的索引進(jìn)行匹配,經(jīng)過(guò)基于TF-IDF算法的相關(guān)性計(jì)算之后,得到搜索排序結(jié)果,提供接口給檢索模塊調(diào)用,最終返回給用戶使用,檢索模塊的詳細(xì)實(shí)現(xiàn)流程如圖4所示。
圖4 檢索的實(shí)現(xiàn)流程圖
(1)分詞器對(duì)查詢關(guān)鍵字進(jìn)行分詞。
(2)通過(guò)MultiFiledQueryParse生成Query對(duì)象,然后在不同的索引列上進(jìn)行多個(gè)關(guān)鍵詞的搜索。
(3)創(chuàng)建IndexSearcher對(duì)象實(shí)例,對(duì)ElasticSearch集群各節(jié)點(diǎn)進(jìn)行索引檢索,將符合條件的搜索結(jié)果合并,然后經(jīng)過(guò)相關(guān)性排序之后,放到結(jié)果集中并返回給用戶。
2.5.2 聯(lián)想搜索的實(shí)現(xiàn)
搜索聯(lián)想是指用戶在搜索框輸入檢索詞的過(guò)程中對(duì)每一個(gè)字進(jìn)行響應(yīng)提示,幫助用戶更快地得到自己先要檢索的內(nèi)容。這個(gè)過(guò)程主要通過(guò)客戶端的動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)Ajax來(lái)完成,服務(wù)端需要統(tǒng)計(jì)用戶歷史檢索詞的頻率,將頻率較高的檢索詞按照前綴匹配結(jié)果返回給前端頁(yè)面,搜索聯(lián)想的實(shí)現(xiàn)流程如圖5所示。
圖5 搜索聯(lián)想的實(shí)現(xiàn)流程圖
(1)用戶輸入檢索詞,前端會(huì)實(shí)時(shí)獲取輸入的內(nèi)容,然后利用Ajax異步地向服務(wù)端發(fā)送聯(lián)想詞搜索的請(qǐng)求;
(2)服務(wù)端將請(qǐng)求到的數(shù)據(jù)在ElasticSearch中進(jìn)行前綴匹配,利用ElasticSearch搜索對(duì)應(yīng)前綴的索引,然后通過(guò)ElasticSearch的bool quer將多個(gè)前綴查詢結(jié)果組合起來(lái)返回給前端;
(3)前端利用Ajax組件庫(kù)中的jQuery完成提示詞顯示,搜索聯(lián)想功能的實(shí)現(xiàn)結(jié)果如圖6所示。
圖6 搜索聯(lián)想的效果圖
Redis[15]是一個(gè)開(kāi)源的高性能數(shù)據(jù)庫(kù),數(shù)據(jù)保存在內(nèi)存中,數(shù)據(jù)讀寫(xiě)效率比傳統(tǒng)數(shù)據(jù)庫(kù)高一個(gè)量級(jí),能夠顯著提升系統(tǒng)的性能。
在本系統(tǒng)中,為了減少數(shù)據(jù)庫(kù)運(yùn)行壓力,提高系統(tǒng)響應(yīng)速度和并發(fā)量,需要引入Redis數(shù)據(jù)庫(kù),把經(jīng)常被訪問(wèn)的數(shù)據(jù)放入Redis數(shù)據(jù)庫(kù)中,對(duì)用戶信息、用戶熱搜資源和平臺(tái)熱搜資源進(jìn)行緩存。同時(shí),為了提升搜索聯(lián)想詞的性能,也要借助緩存機(jī)制將高頻的前綴匹配結(jié)果存放在內(nèi)存,從而不用每一次都訪問(wèn)數(shù)據(jù)庫(kù)。
對(duì)搜索引擎而言,衡量系統(tǒng)性能的關(guān)鍵指標(biāo)是系統(tǒng)的響應(yīng)時(shí)間。本實(shí)驗(yàn)采用某機(jī)構(gòu)約5萬(wàn)份科技資源文本數(shù)據(jù)作為實(shí)驗(yàn)對(duì)象,測(cè)試檢索詞選擇生物醫(yī)療、機(jī)器學(xué)習(xí)、物聯(lián)網(wǎng)、發(fā)明4個(gè)詞,分別記錄在本搜索引擎和關(guān)系型數(shù)據(jù)庫(kù)MySQL中進(jìn)行搜索時(shí)第1次查詢與第n次(n=10)查詢的平均速度。實(shí)驗(yàn)結(jié)果如表3所示。通過(guò)實(shí)驗(yàn)結(jié)果表可以得出:基于ElasticSearch的科技資源檢索系統(tǒng)的檢索效率遠(yuǎn)遠(yuǎn)高于傳統(tǒng)的基于數(shù)據(jù)庫(kù)的檢索系統(tǒng)。
表3 檢索時(shí)間對(duì)比
本文在深入研究分布式檢索原理、ElasticSearch相關(guān)技術(shù)的基礎(chǔ)上,實(shí)現(xiàn)了基于ElasticSearch的科技資源檢索系統(tǒng),進(jìn)行了檢索速率的測(cè)試,而且和傳統(tǒng)的MySQL數(shù)據(jù)庫(kù)檢索速率進(jìn)行比較,獲得了較好的測(cè)試效果。本系統(tǒng)可以實(shí)現(xiàn)對(duì)檢索內(nèi)容的分詞,提高了檢索的準(zhǔn)確率,系統(tǒng)通過(guò)Redis數(shù)據(jù)庫(kù)來(lái)緩存熱搜信息以及用戶信息,提高了系統(tǒng)響應(yīng)速度。系統(tǒng)使用Ajax技術(shù),實(shí)現(xiàn)了服務(wù)器端和客戶端的異步通信,達(dá)到了搜索提示和相關(guān)搜索的功能,使用戶界面更加友好。但系統(tǒng)也有一些不足之處:
(1)在比較了多種分詞器的基礎(chǔ)上,本系統(tǒng)采用了IKAnalyzer進(jìn)行中文分詞。但由于科技資源領(lǐng)域的專業(yè)詞匯較多,導(dǎo)致ElasticSearch中未記錄的詞匯增多,會(huì)在一定程度上降低查詢的準(zhǔn)確性。因此,在后續(xù)的研究中可以針對(duì)科技資源領(lǐng)域建立專業(yè)詞匯表,提高中文分詞的準(zhǔn)確性。
(2)本系統(tǒng)使用了相對(duì)比較簡(jiǎn)單的相關(guān)性排序算法對(duì)搜索結(jié)果排序。在后續(xù)的研究中,將通過(guò)改進(jìn)評(píng)分策略和排序算法,構(gòu)造出性能更完美且檢索效率更高的分布式搜索引擎。