王 偉,魏 樂,劉文清,舒紅平
(1.成都信息工程大學 計算機學院,四川 成都 610225;2.國家統(tǒng)計局統(tǒng)計信息技術(shù)與數(shù)據(jù)挖掘重點開放實驗室,四川 成都 610103)
隨著信息技術(shù)的發(fā)展,互聯(lián)網(wǎng)的數(shù)據(jù)急劇增加,在海量復雜的數(shù)據(jù)中,如何高效便捷地獲取信息[1]已成為當前互聯(lián)網(wǎng)服務商亟待解決的問題,搜索系統(tǒng)的出現(xiàn)很好的解決了這一問題。搜索系統(tǒng)是指能對文本中特定關(guān)鍵字執(zhí)行檢索操作的軟件系統(tǒng),通常將能夠進行全文檢索的軟件系統(tǒng)稱為搜索引擎。但是,目前互聯(lián)網(wǎng)上常見的各類搜索引擎架構(gòu)以集中式為主,在容錯性、訪問效率、可擴展性、I/O方面存在瓶頸,越來越難以應對數(shù)據(jù)量飛速增加所帶來的問題。
Lucene[2]屬于Jakarta項目下的子項目,是由Apache基金會開源的搜索引擎工具包。它為程序開發(fā)人員提供了一套實用的工具,這套工具包含了相關(guān)性、索引、排序等搜索引擎基礎(chǔ)功能,在此基礎(chǔ)上用戶可以搭建一個完整的搜索系統(tǒng)。在各個領(lǐng)域中,Lucene都被認為是目前為止性能最優(yōu)、功能最完善、技術(shù)領(lǐng)先的搜索引擎庫。但作為開發(fā)庫而言,Lucene和真正的搜索引擎不能一概而論,使用Lucene搭建搜索引擎仍然要解決數(shù)據(jù)接入、獲取、分析等方面的問題,而且Lucene沒有提供對分布式的解決方案,在對大量數(shù)據(jù)進行并行處理時會比較麻煩。
ElasticSearch[3]是一款基于Lucene工具包的支持分布式的開源全文檢索系統(tǒng),在企業(yè)中非常受歡迎,維基百科(Wikipedia)、StackOverflow、Github等公司的全文檢索、關(guān)鍵詞高亮、實時鍵入搜索、自動糾錯、相關(guān)內(nèi)容推薦等功能都是基于ElasticSearch實現(xiàn)的。除此之外,ElasticSearch也備受創(chuàng)業(yè)公司的青睞,它對機器的性能沒有較嚴苛的要求,即使在普通PC機組成的集群中也可以正常運行。
ElasticSearch雖然在企業(yè)中得到了應用,但是因為ElasticSearch屬于較新的技術(shù)框架,在構(gòu)建系統(tǒng)時還面臨接入技術(shù)選型、數(shù)據(jù)索引等問題。針對這些問題,本文在基于ElasticSearch技術(shù)的基礎(chǔ)上,提出基于ElasticSearch的分布式全文搜索系統(tǒng)實現(xiàn)方案,對其中關(guān)鍵技術(shù)進行了深入研究。
從數(shù)據(jù)流向開始,就需要確定數(shù)據(jù)以何種方式同步或遷移到系統(tǒng)中,在數(shù)據(jù)同步或遷移過程中可能出現(xiàn)數(shù)據(jù)冗余問題,因此需要實現(xiàn)一個可以校驗重復數(shù)據(jù)且可靠性高的數(shù)據(jù)接入過程,所以,數(shù)據(jù)整合工具是必有產(chǎn)物。ETL[4](Extract-Transform-Load)技術(shù)屬于數(shù)據(jù)整合技術(shù)的一種,主要完成將數(shù)據(jù)從一個或多個數(shù)據(jù)源到另一個數(shù)據(jù)源的抽取、轉(zhuǎn)換、校驗等工作。
ETL處理步驟:首先通過一個驗證節(jié)點確定輸入端抽取到的數(shù)據(jù)是什么類型,然后把數(shù)據(jù)送到特定的轉(zhuǎn)換節(jié)點處進行處理,數(shù)據(jù)處理完成后將其傳遞到下一個轉(zhuǎn)換節(jié)點或一個目標文件,如果發(fā)生錯誤則轉(zhuǎn)移到處理錯誤的流程上進行相應的處理。
分布式全文搜索系統(tǒng)通過索引器對接入的數(shù)據(jù)源中的數(shù)據(jù)進行具體的分析及分類,然后建立索引。從靜態(tài)層面來看,每個數(shù)據(jù)索引都是針對特定詞元創(chuàng)建的倒排索引[5](Inverted Index),倒排索引是ElasticSearch針對全文檢索使用的索引數(shù)據(jù)結(jié)構(gòu),對于搜索引擎而言,數(shù)據(jù)結(jié)構(gòu)的重要性要高于程序編碼。
倒排索引由兩部分構(gòu)成完整的映射,分別是文檔中出現(xiàn)的詞條列表和詞條在文檔中對應的位置,分別表示為:D={d1,d2,…,dn},T={t1,t2,…,tn}。
即給出一個詞條ti在不同dj中出現(xiàn)的次數(shù),把對所有文檔中不同詞條出現(xiàn)情況描述的表稱為倒排索引表。
例如,存在兩個文檔,文檔內(nèi)容分別為(英文默認按空格切分,而中文一般要通過中文分詞[6]過程,不同中文分詞算法得到的結(jié)果不同,這里不展開討論):
(1)You can exactly find that the characteristic of ElasticSearch is easy to get started with。
(2)That exact points of ElasticSearch have always been its distributed model。
創(chuàng)建倒排索引時需要對文檔的內(nèi)容進行劃分,然后把得到的詞條進行排序,從上文例句中可得表1。
表1 舉例中對應的倒排索引表
如果搜索“that ElasticSearch”,從表1中可以查詢到兩個文檔都會被關(guān)鍵詞匹配,文檔2中有1個匹配詞,文檔1中有兩個匹配詞,如果根據(jù)簡單的相似度算法計算文檔被關(guān)鍵詞匹配的次數(shù),就可以得到文檔1的相關(guān)度大于文檔2。
但是在實際應用中,用戶希望搜索下列情況中兩個相關(guān)詞中的任意一個時,兩個相關(guān)詞都能同時被匹配到,上述索引表不能實現(xiàn)用戶的這一需求:
情況1That和that首字母大小寫;
情況2exact和exactly是同根詞;
情況3characteristic和point是同義詞。
因此,需要在索引器中加入相應規(guī)則,把相關(guān)詞轉(zhuǎn)成統(tǒng)一的標準格式,例如:
(1)That可以轉(zhuǎn)成that;
(2)exactly可以轉(zhuǎn)成exact;
(3)同義詞characteristic和point只索引成characteristic。
為了分析Elasticsearch中倒排索引結(jié)構(gòu)對搜索性能的影響,設以下變量:
(1)不同倒排索引表的長度為Sj;
(3)因為數(shù)據(jù)的差異性,取d作為數(shù)據(jù)量的平均值;
(4)作為搜索引擎,在分析性能時還需要考慮系統(tǒng)響應時間t、系統(tǒng)輸出峰值O以及查詢操作數(shù)q。
現(xiàn)依據(jù)上述參數(shù)建立ElasticSearch索引的性能模型。根據(jù)同一時間的查詢操作q得出:ElasticSearch中存在的所有數(shù)據(jù)量D=倒排索引表的平均數(shù)據(jù)量×所有查詢操作涉及到的表的個數(shù)。
對于q個查詢操作,每個查詢可能指向N個詞條集合中的任意一個或多個,即可能存在的映射個數(shù)為Nq。q個查詢指向N個詞條中的某一個詞條的數(shù)量范圍為[1,k],對于某個詞條上的不同查詢操作數(shù)的概率記為fN,q(i),i=1,2,…,k。可得
(1)
以上模型建立在每個查詢操作是隨機、獨立的。
從模型可以看出,這兩點在使用倒排索引作為索引結(jié)構(gòu)的ElasticSearch分布式系統(tǒng)中,極大的改善了集中式搜索引擎的并行處理的瓶頸。
分布式全文搜索系統(tǒng)是在海量數(shù)據(jù)中提供秒數(shù)量級查詢服務的系統(tǒng),能夠?qū)?shù)據(jù)進行存儲、冗余備份及全文檢索,可適當?shù)貙?shù)據(jù)進行統(tǒng)計和分類。
針對數(shù)據(jù)規(guī)模、性能要求和功能需求,基于ElasticSearch的分布式全文搜索系統(tǒng)包括數(shù)據(jù)同步和數(shù)據(jù)索引等,主要分成數(shù)據(jù)接入、數(shù)據(jù)索引、全文搜索3個模塊設計。
圖1 全文搜索系統(tǒng)架構(gòu)
如圖1所示,全文搜索系統(tǒng)從指定數(shù)據(jù)源爬取數(shù)據(jù),通過Kettle(一款基于Java的開源ETL工具)接入到ElasticSearch集群中,并建立對應的倒排索引表,經(jīng)過排序后提供接口[7]給搜索模塊調(diào)用并最終供用戶使用。
首先數(shù)據(jù)接入模塊完成對數(shù)據(jù)的遷移工作,考慮到系統(tǒng)的結(jié)構(gòu)設計簡單化,盡量以ElasticSearch作為系統(tǒng)唯一的數(shù)據(jù)存儲模塊。但一些應用場景下[8-10],需要在現(xiàn)有的系統(tǒng)基礎(chǔ)上新增ElasticSearch的檢索支持,以避免系統(tǒng)新增全文檢索支持帶來的重構(gòu)風險。本系統(tǒng)采用Kettle作為數(shù)據(jù)同步工具,支持和常用數(shù)據(jù)庫之間的數(shù)據(jù)遷移、同步工作,如圖2所示。
圖2 ElasticSearch數(shù)據(jù)同步場景
這是一種典型的數(shù)據(jù)接入同步過程,存在多個數(shù)據(jù)源,一個數(shù)據(jù)緩沖區(qū),一個可以被用戶訪問到的ElasticSearch集群,數(shù)據(jù)緩沖區(qū)和集群之間的數(shù)據(jù)抽取都是通過Kettle技術(shù)來完成的。其中數(shù)據(jù)緩沖區(qū)主要負責暫時存放從源中抽取到的數(shù)據(jù)。
系統(tǒng)采用Bulk方式的批量索引數(shù)據(jù)[11],可以把多個索引操作通過一次請求發(fā)送到集群中,再通過每個數(shù)據(jù)的id做哈希轉(zhuǎn)換,進而把不同數(shù)據(jù)分配到對應分片上。在對數(shù)據(jù)進行分片以后,還需要對詞條進行分析處理,包括字符過濾和字符轉(zhuǎn)換等數(shù)據(jù)清洗工作。之后,數(shù)據(jù)索引模塊再選用合適的分詞器對處理后的數(shù)據(jù)做進一步加工,通過索引器建立索引結(jié)構(gòu)提供給搜索模塊使用。全文搜索模塊是在ElasticSearch分布式集群上,根據(jù)用戶輸入的信息[12],以及選擇的搜索方式執(zhí)行實時搜索并返回結(jié)果。
全文搜索模塊給用戶提供一個圖形化交互性界面[13],主要對終端用戶提交的關(guān)鍵字進行解析,再選擇合適的搜索方式向Jetty容器提交搜索請求,Jetty容器對請求解析后分發(fā)給集群中的各個分片,在得到全部分片的分布式響應后,把結(jié)果反饋給用戶。
基于ElasticSearch的分布式全文搜索系統(tǒng)使用3臺Linux服務器組成集群,服務器硬件配置如表2所示。
表2 集群硬件配置
集群的操作系統(tǒng)為Red Hat Enterprise Linux Server release 6.2,ElasticSearch軟件版本為5.3.0。
2.3.1 數(shù)據(jù)存儲實現(xiàn)
ElasticSearch在建立倒排索引表時,需要先把文檔內(nèi)容存儲進庫中,然后更新倒排索引表?;贓lasticSearch建立數(shù)據(jù)索引的代碼如下:
∥ 1.上傳文檔建立索引
IndexResponse response=client.prepareIndex(index,type,id).setSource(json).get();
∥ 2.對所有倒排索引中的特定字段搜索關(guān)鍵字
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("key","value");
SearchRequestBuilder searchRequestBuilder = client.prepareSearch().setQuery(matchQueryBuilder).setSize(length);
SearchResponse searchKey = searchRequestBuilder.get();
∥ 3. 得到的SearchResponse類型可以通過迭代器打印結(jié)果
SearchHits hits = searchKey.getHits();
Iterator
while (iterator.hasNext()) {
SearchHit next = iterator.next();
System.out.println(next.getSourceAsString());
System.out.println(next.score());
}
∥ 4.使用結(jié)束后關(guān)閉client資源
client.close();
2.3.2 運行實例
全文搜索系統(tǒng)[14-15]在執(zhí)行搜索時,會在所有倒排索引表中查找符合條件的表,再根據(jù)對應詞條的id提取出文檔內(nèi)容,并對文檔中關(guān)鍵詞進行高亮標注,圖3為全文搜索系統(tǒng)的實現(xiàn)實例。
圖3 全文搜索系統(tǒng)界面
2.3.3 性能測試
為了測試系統(tǒng)響應并發(fā)查詢請求的性能,通過改變查詢操作線程數(shù)來得到對應的系統(tǒng)響應時間,從而繪制了變化曲線圖(每點響應時間均為重復測試后求得的平均數(shù))。
圖4 并發(fā)查詢響應
由圖4可知,本系統(tǒng)的并發(fā)性能完全符合要求,在高并發(fā)的查詢操作中,響應時間呈穩(wěn)定曲線。
本文基于ElasticSearch對分布式全文搜索系統(tǒng)進行設計和實現(xiàn),對系統(tǒng)的數(shù)據(jù)接入、倒排索引及實現(xiàn)方案進行了深入研究,提出了倒排索引的性能模型,模型表明了ElaticSearch使用的倒排索引數(shù)據(jù)結(jié)構(gòu)對分布式搜索系統(tǒng)的性能有一定優(yōu)化作用,并通過多線程查詢測試驗證,具有可行性。系統(tǒng)具有高并發(fā)高穩(wěn)定性的特點,彌補了傳統(tǒng)集中式搜索引擎的瓶頸。但由于條件限制,本文研究內(nèi)容屬于實驗性研究,未能在超大規(guī)模集群中進行完整的測試,因此在后續(xù)應用中需要進一步完善。