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