国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于ElasticSearch的分布式全文搜索系統(tǒng)

2018-07-23 05:31:08劉文清舒紅平
電子科技 2018年8期
關(guān)鍵詞:全文檢索詞條搜索引擎

王 偉,魏 樂(lè),劉文清,舒紅平

(1.成都信息工程大學(xué) 計(jì)算機(jī)學(xué)院,四川 成都 610225;2.國(guó)家統(tǒng)計(jì)局統(tǒng)計(jì)信息技術(shù)與數(shù)據(jù)挖掘重點(diǎn)開(kāi)放實(shí)驗(yàn)室,四川 成都 610103)

隨著信息技術(shù)的發(fā)展,互聯(lián)網(wǎng)的數(shù)據(jù)急劇增加,在海量復(fù)雜的數(shù)據(jù)中,如何高效便捷地獲取信息[1]已成為當(dāng)前互聯(lián)網(wǎng)服務(wù)商亟待解決的問(wèn)題,搜索系統(tǒng)的出現(xiàn)很好的解決了這一問(wèn)題。搜索系統(tǒng)是指能對(duì)文本中特定關(guān)鍵字執(zhí)行檢索操作的軟件系統(tǒng),通常將能夠進(jìn)行全文檢索的軟件系統(tǒng)稱為搜索引擎。但是,目前互聯(lián)網(wǎng)上常見(jiàn)的各類搜索引擎架構(gòu)以集中式為主,在容錯(cuò)性、訪問(wèn)效率、可擴(kuò)展性、I/O方面存在瓶頸,越來(lái)越難以應(yīng)對(duì)數(shù)據(jù)量飛速增加所帶來(lái)的問(wèn)題。

Lucene[2]屬于Jakarta項(xiàng)目下的子項(xiàng)目,是由Apache基金會(huì)開(kāi)源的搜索引擎工具包。它為程序開(kāi)發(fā)人員提供了一套實(shí)用的工具,這套工具包含了相關(guān)性、索引、排序等搜索引擎基礎(chǔ)功能,在此基礎(chǔ)上用戶可以搭建一個(gè)完整的搜索系統(tǒng)。在各個(gè)領(lǐng)域中,Lucene都被認(rèn)為是目前為止性能最優(yōu)、功能最完善、技術(shù)領(lǐng)先的搜索引擎庫(kù)。但作為開(kāi)發(fā)庫(kù)而言,Lucene和真正的搜索引擎不能一概而論,使用Lucene搭建搜索引擎仍然要解決數(shù)據(jù)接入、獲取、分析等方面的問(wèn)題,而且Lucene沒(méi)有提供對(duì)分布式的解決方案,在對(duì)大量數(shù)據(jù)進(jìn)行并行處理時(shí)會(huì)比較麻煩。

ElasticSearch[3]是一款基于Lucene工具包的支持分布式的開(kāi)源全文檢索系統(tǒng),在企業(yè)中非常受歡迎,維基百科(Wikipedia)、StackOverflow、Github等公司的全文檢索、關(guān)鍵詞高亮、實(shí)時(shí)鍵入搜索、自動(dòng)糾錯(cuò)、相關(guān)內(nèi)容推薦等功能都是基于ElasticSearch實(shí)現(xiàn)的。除此之外,ElasticSearch也備受創(chuàng)業(yè)公司的青睞,它對(duì)機(jī)器的性能沒(méi)有較嚴(yán)苛的要求,即使在普通PC機(jī)組成的集群中也可以正常運(yùn)行。

ElasticSearch雖然在企業(yè)中得到了應(yīng)用,但是因?yàn)镋lasticSearch屬于較新的技術(shù)框架,在構(gòu)建系統(tǒng)時(shí)還面臨接入技術(shù)選型、數(shù)據(jù)索引等問(wèn)題。針對(duì)這些問(wèn)題,本文在基于ElasticSearch技術(shù)的基礎(chǔ)上,提出基于ElasticSearch的分布式全文搜索系統(tǒng)實(shí)現(xiàn)方案,對(duì)其中關(guān)鍵技術(shù)進(jìn)行了深入研究。

1 全文搜索引擎框架分析

1.1 ETL數(shù)據(jù)接入技術(shù)

從數(shù)據(jù)流向開(kāi)始,就需要確定數(shù)據(jù)以何種方式同步或遷移到系統(tǒng)中,在數(shù)據(jù)同步或遷移過(guò)程中可能出現(xiàn)數(shù)據(jù)冗余問(wèn)題,因此需要實(shí)現(xiàn)一個(gè)可以校驗(yàn)重復(fù)數(shù)據(jù)且可靠性高的數(shù)據(jù)接入過(guò)程,所以,數(shù)據(jù)整合工具是必有產(chǎn)物。ETL[4](Extract-Transform-Load)技術(shù)屬于數(shù)據(jù)整合技術(shù)的一種,主要完成將數(shù)據(jù)從一個(gè)或多個(gè)數(shù)據(jù)源到另一個(gè)數(shù)據(jù)源的抽取、轉(zhuǎn)換、校驗(yàn)等工作。

ETL處理步驟:首先通過(guò)一個(gè)驗(yàn)證節(jié)點(diǎn)確定輸入端抽取到的數(shù)據(jù)是什么類型,然后把數(shù)據(jù)送到特定的轉(zhuǎn)換節(jié)點(diǎn)處進(jìn)行處理,數(shù)據(jù)處理完成后將其傳遞到下一個(gè)轉(zhuǎn)換節(jié)點(diǎn)或一個(gè)目標(biāo)文件,如果發(fā)生錯(cuò)誤則轉(zhuǎn)移到處理錯(cuò)誤的流程上進(jìn)行相應(yīng)的處理。

1.2 倒排索引數(shù)據(jù)結(jié)構(gòu)

分布式全文搜索系統(tǒng)通過(guò)索引器對(duì)接入的數(shù)據(jù)源中的數(shù)據(jù)進(jìn)行具體的分析及分類,然后建立索引。從靜態(tài)層面來(lái)看,每個(gè)數(shù)據(jù)索引都是針對(duì)特定詞元?jiǎng)?chuàng)建的倒排索引[5](Inverted Index),倒排索引是ElasticSearch針對(duì)全文檢索使用的索引數(shù)據(jù)結(jié)構(gòu),對(duì)于搜索引擎而言,數(shù)據(jù)結(jié)構(gòu)的重要性要高于程序編碼。

倒排索引由兩部分構(gòu)成完整的映射,分別是文檔中出現(xiàn)的詞條列表和詞條在文檔中對(duì)應(yīng)的位置,分別表示為:D={d1,d2,…,dn},T={t1,t2,…,tn}。

即給出一個(gè)詞條ti在不同dj中出現(xiàn)的次數(shù),把對(duì)所有文檔中不同詞條出現(xiàn)情況描述的表稱為倒排索引表。

例如,存在兩個(gè)文檔,文檔內(nèi)容分別為(英文默認(rèn)按空格切分,而中文一般要通過(guò)中文分詞[6]過(guò)程,不同中文分詞算法得到的結(jié)果不同,這里不展開(kāi)討論):

(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)建倒排索引時(shí)需要對(duì)文檔的內(nèi)容進(jìn)行劃分,然后把得到的詞條進(jìn)行排序,從上文例句中可得表1。

表1 舉例中對(duì)應(yīng)的倒排索引表

如果搜索“that ElasticSearch”,從表1中可以查詢到兩個(gè)文檔都會(huì)被關(guān)鍵詞匹配,文檔2中有1個(gè)匹配詞,文檔1中有兩個(gè)匹配詞,如果根據(jù)簡(jiǎn)單的相似度算法計(jì)算文檔被關(guān)鍵詞匹配的次數(shù),就可以得到文檔1的相關(guān)度大于文檔2。

但是在實(shí)際應(yīng)用中,用戶希望搜索下列情況中兩個(gè)相關(guān)詞中的任意一個(gè)時(shí),兩個(gè)相關(guān)詞都能同時(shí)被匹配到,上述索引表不能實(shí)現(xiàn)用戶的這一需求:

情況1That和that首字母大小寫(xiě);

情況2exact和exactly是同根詞;

情況3characteristic和point是同義詞。

因此,需要在索引器中加入相應(yīng)規(guī)則,把相關(guān)詞轉(zhuǎn)成統(tǒng)一的標(biāo)準(zhǔn)格式,例如:

(1)That可以轉(zhuǎn)成that;

(2)exactly可以轉(zhuǎn)成exact;

(3)同義詞characteristic和point只索引成characteristic。

1.3 倒排索引性能分析

為了分析Elasticsearch中倒排索引結(jié)構(gòu)對(duì)搜索性能的影響,設(shè)以下變量:

(1)不同倒排索引表的長(zhǎng)度為Sj;

(3)因?yàn)閿?shù)據(jù)的差異性,取d作為數(shù)據(jù)量的平均值;

(4)作為搜索引擎,在分析性能時(shí)還需要考慮系統(tǒng)響應(yīng)時(shí)間t、系統(tǒng)輸出峰值O以及查詢操作數(shù)q。

現(xiàn)依據(jù)上述參數(shù)建立ElasticSearch索引的性能模型。根據(jù)同一時(shí)間的查詢操作q得出:ElasticSearch中存在的所有數(shù)據(jù)量D=倒排索引表的平均數(shù)據(jù)量×所有查詢操作涉及到的表的個(gè)數(shù)。

對(duì)于q個(gè)查詢操作,每個(gè)查詢可能指向N個(gè)詞條集合中的任意一個(gè)或多個(gè),即可能存在的映射個(gè)數(shù)為Nq。q個(gè)查詢指向N個(gè)詞條中的某一個(gè)詞條的數(shù)量范圍為[1,k],對(duì)于某個(gè)詞條上的不同查詢操作數(shù)的概率記為fN,q(i),i=1,2,…,k。可得

(1)

以上模型建立在每個(gè)查詢操作是隨機(jī)、獨(dú)立的。

從模型可以看出,這兩點(diǎn)在使用倒排索引作為索引結(jié)構(gòu)的ElasticSearch分布式系統(tǒng)中,極大的改善了集中式搜索引擎的并行處理的瓶頸。

2 分布式全文搜索系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)

分布式全文搜索系統(tǒng)是在海量數(shù)據(jù)中提供秒數(shù)量級(jí)查詢服務(wù)的系統(tǒng),能夠?qū)?shù)據(jù)進(jìn)行存儲(chǔ)、冗余備份及全文檢索,可適當(dāng)?shù)貙?duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)和分類。

2.1 系統(tǒng)總體架構(gòu)

針對(duì)數(shù)據(jù)規(guī)模、性能要求和功能需求,基于ElasticSearch的分布式全文搜索系統(tǒng)包括數(shù)據(jù)同步和數(shù)據(jù)索引等,主要分成數(shù)據(jù)接入、數(shù)據(jù)索引、全文搜索3個(gè)模塊設(shè)計(jì)。

圖1 全文搜索系統(tǒng)架構(gòu)

如圖1所示,全文搜索系統(tǒng)從指定數(shù)據(jù)源爬取數(shù)據(jù),通過(guò)Kettle(一款基于Java的開(kāi)源ETL工具)接入到ElasticSearch集群中,并建立對(duì)應(yīng)的倒排索引表,經(jīng)過(guò)排序后提供接口[7]給搜索模塊調(diào)用并最終供用戶使用。

2.2 系統(tǒng)結(jié)構(gòu)設(shè)計(jì)

首先數(shù)據(jù)接入模塊完成對(duì)數(shù)據(jù)的遷移工作,考慮到系統(tǒng)的結(jié)構(gòu)設(shè)計(jì)簡(jiǎn)單化,盡量以ElasticSearch作為系統(tǒng)唯一的數(shù)據(jù)存儲(chǔ)模塊。但一些應(yīng)用場(chǎng)景下[8-10],需要在現(xiàn)有的系統(tǒng)基礎(chǔ)上新增ElasticSearch的檢索支持,以避免系統(tǒng)新增全文檢索支持帶來(lái)的重構(gòu)風(fēng)險(xiǎn)。本系統(tǒng)采用Kettle作為數(shù)據(jù)同步工具,支持和常用數(shù)據(jù)庫(kù)之間的數(shù)據(jù)遷移、同步工作,如圖2所示。

圖2 ElasticSearch數(shù)據(jù)同步場(chǎng)景

這是一種典型的數(shù)據(jù)接入同步過(guò)程,存在多個(gè)數(shù)據(jù)源,一個(gè)數(shù)據(jù)緩沖區(qū),一個(gè)可以被用戶訪問(wèn)到的ElasticSearch集群,數(shù)據(jù)緩沖區(qū)和集群之間的數(shù)據(jù)抽取都是通過(guò)Kettle技術(shù)來(lái)完成的。其中數(shù)據(jù)緩沖區(qū)主要負(fù)責(zé)暫時(shí)存放從源中抽取到的數(shù)據(jù)。

系統(tǒng)采用Bulk方式的批量索引數(shù)據(jù)[11],可以把多個(gè)索引操作通過(guò)一次請(qǐng)求發(fā)送到集群中,再通過(guò)每個(gè)數(shù)據(jù)的id做哈希轉(zhuǎn)換,進(jìn)而把不同數(shù)據(jù)分配到對(duì)應(yīng)分片上。在對(duì)數(shù)據(jù)進(jìn)行分片以后,還需要對(duì)詞條進(jìn)行分析處理,包括字符過(guò)濾和字符轉(zhuǎn)換等數(shù)據(jù)清洗工作。之后,數(shù)據(jù)索引模塊再選用合適的分詞器對(duì)處理后的數(shù)據(jù)做進(jìn)一步加工,通過(guò)索引器建立索引結(jié)構(gòu)提供給搜索模塊使用。全文搜索模塊是在ElasticSearch分布式集群上,根據(jù)用戶輸入的信息[12],以及選擇的搜索方式執(zhí)行實(shí)時(shí)搜索并返回結(jié)果。

全文搜索模塊給用戶提供一個(gè)圖形化交互性界面[13],主要對(duì)終端用戶提交的關(guān)鍵字進(jìn)行解析,再選擇合適的搜索方式向Jetty容器提交搜索請(qǐng)求,Jetty容器對(duì)請(qǐng)求解析后分發(fā)給集群中的各個(gè)分片,在得到全部分片的分布式響應(yīng)后,把結(jié)果反饋給用戶。

2.3 系統(tǒng)實(shí)現(xiàn)

基于ElasticSearch的分布式全文搜索系統(tǒng)使用3臺(tái)Linux服務(wù)器組成集群,服務(wù)器硬件配置如表2所示。

表2 集群硬件配置

集群的操作系統(tǒng)為Red Hat Enterprise Linux Server release 6.2,ElasticSearch軟件版本為5.3.0。

2.3.1 數(shù)據(jù)存儲(chǔ)實(shí)現(xiàn)

ElasticSearch在建立倒排索引表時(shí),需要先把文檔內(nèi)容存儲(chǔ)進(jìn)庫(kù)中,然后更新倒排索引表。基于ElasticSearch建立數(shù)據(jù)索引的代碼如下:

∥ 1.上傳文檔建立索引

IndexResponse response=client.prepareIndex(index,type,id).setSource(json).get();

∥ 2.對(duì)所有倒排索引中的特定字段搜索關(guān)鍵字

MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("key","value");

SearchRequestBuilder searchRequestBuilder = client.prepareSearch().setQuery(matchQueryBuilder).setSize(length);

SearchResponse searchKey = searchRequestBuilder.get();

∥ 3. 得到的SearchResponse類型可以通過(guò)迭代器打印結(jié)果

SearchHits hits = searchKey.getHits();

Iterator iterator = hits.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 運(yùn)行實(shí)例

全文搜索系統(tǒng)[14-15]在執(zhí)行搜索時(shí),會(huì)在所有倒排索引表中查找符合條件的表,再根據(jù)對(duì)應(yīng)詞條的id提取出文檔內(nèi)容,并對(duì)文檔中關(guān)鍵詞進(jìn)行高亮標(biāo)注,圖3為全文搜索系統(tǒng)的實(shí)現(xiàn)實(shí)例。

圖3 全文搜索系統(tǒng)界面

2.3.3 性能測(cè)試

為了測(cè)試系統(tǒng)響應(yīng)并發(fā)查詢請(qǐng)求的性能,通過(guò)改變查詢操作線程數(shù)來(lái)得到對(duì)應(yīng)的系統(tǒng)響應(yīng)時(shí)間,從而繪制了變化曲線圖(每點(diǎn)響應(yīng)時(shí)間均為重復(fù)測(cè)試后求得的平均數(shù))。

圖4 并發(fā)查詢響應(yīng)

由圖4可知,本系統(tǒng)的并發(fā)性能完全符合要求,在高并發(fā)的查詢操作中,響應(yīng)時(shí)間呈穩(wěn)定曲線。

3 結(jié)束語(yǔ)

本文基于ElasticSearch對(duì)分布式全文搜索系統(tǒng)進(jìn)行設(shè)計(jì)和實(shí)現(xiàn),對(duì)系統(tǒng)的數(shù)據(jù)接入、倒排索引及實(shí)現(xiàn)方案進(jìn)行了深入研究,提出了倒排索引的性能模型,模型表明了ElaticSearch使用的倒排索引數(shù)據(jù)結(jié)構(gòu)對(duì)分布式搜索系統(tǒng)的性能有一定優(yōu)化作用,并通過(guò)多線程查詢測(cè)試驗(yàn)證,具有可行性。系統(tǒng)具有高并發(fā)高穩(wěn)定性的特點(diǎn),彌補(bǔ)了傳統(tǒng)集中式搜索引擎的瓶頸。但由于條件限制,本文研究?jī)?nèi)容屬于實(shí)驗(yàn)性研究,未能在超大規(guī)模集群中進(jìn)行完整的測(cè)試,因此在后續(xù)應(yīng)用中需要進(jìn)一步完善。

猜你喜歡
全文檢索詞條搜索引擎
2016年4月中國(guó)直銷網(wǎng)絡(luò)熱門(mén)詞條榜
2016年3月中國(guó)直銷網(wǎng)絡(luò)熱門(mén)詞條榜
Oracle數(shù)據(jù)庫(kù)全文檢索性能研究
2016年9月中國(guó)直銷網(wǎng)絡(luò)熱門(mén)詞條榜
網(wǎng)絡(luò)搜索引擎亟待規(guī)范
大數(shù)據(jù)相關(guān)詞條
基于Nutch的醫(yī)療搜索引擎的研究與開(kāi)發(fā)
基于KySou的全文檢索系統(tǒng)的分析與優(yōu)化
廣告主與搜索引擎的雙向博弈分析
特色數(shù)據(jù)庫(kù)全文檢索系統(tǒng)的設(shè)計(jì)
西和县| 棋牌| 庆云县| 房山区| 沛县| 涟水县| 寻甸| 兴安县| 太和县| 紫阳县| 漳浦县| 乐山市| 平谷区| 抚州市| 攀枝花市| 黔东| 芜湖市| 昌邑市| 宁陕县| 临江市| 柳河县| 肥城市| 东莞市| 遂平县| 南乐县| 庆元县| 沙河市| 文水县| 志丹县| 清新县| 怀宁县| 临潭县| 屏南县| 江油市| 温宿县| 黑河市| 临湘市| 怀柔区| 卢湾区| 克什克腾旗| 大新县|