魏濤,孟方園,袁平,殷鋒
(1.四川大學(xué)計算機(jī)學(xué)院,成都 610065;2.北京衛(wèi)星導(dǎo)航中心,北京 100094;3.重慶第二師范學(xué)院,重慶 400067;4.西南民族大學(xué)校園網(wǎng)絡(luò)管理中心,成都 610064)
在信息化高速發(fā)展的今天,大量的智能設(shè)備以及人類的活動通過互聯(lián)網(wǎng)進(jìn)行計算和通信,從而在互聯(lián)網(wǎng)上產(chǎn)生了大量的信息,在這些海量的信息中既包含著對我們有用的信息,同時也充斥的大量的無用信息,用傳統(tǒng)的工具如關(guān)系型數(shù)據(jù)庫對這些信息進(jìn)行存儲,檢索和分析顯然力不從心[1]。因此,有大量的工具被開發(fā)出來,從而為檢索和處理海量的數(shù)據(jù)提供了有效的解決辦法[2]。其中,作為同為基于全文搜索框架Apache Lucene的Elasticsearch和Solr,其主要功能相似,但在配置部署,使用及檢索性能方面存在一定的區(qū)別,本文通過對二者進(jìn)行對比和分析,為項目成員對這二者搜索引擎的選擇提供參考。
Elasticsearch是一個分布式、可擴(kuò)展、實(shí)時的搜索與數(shù)據(jù)分析引擎。Elasticsearch不僅可以全文搜索,同時提供結(jié)構(gòu)化搜索、數(shù)據(jù)分析、復(fù)雜的語言處理、地理位置和對象間關(guān)聯(lián)關(guān)系等[3]。通過REST和schemafree的JSON文檔提供分布式、多租戶全文搜索。并且官方提供 Java,Groovy,PHP,Ruby,Perl,Python,.NET和JavaScript客戶端。許多互聯(lián)網(wǎng)公司使用Elastic?search作為其內(nèi)部搜索引擎,如Wikipedia使用Elastic?search提供帶有高亮片段的全文搜索。衛(wèi)報使用Elas?ticsearch將網(wǎng)絡(luò)社交數(shù)據(jù)結(jié)合到訪客日志中,實(shí)時的給它的編輯們提供公眾對于新文章的反饋。Stack Over?flow將地理位置查詢?nèi)谌肴臋z索中去,并且使用more-like-this接口去查找相關(guān)的問題與答案。GitHub使用Elasticsearch對1300億行代碼進(jìn)行查詢。
Solr支持許多世界上最大的互聯(lián)網(wǎng)站點(diǎn)的搜索和導(dǎo)航功能。Solr它是一種開放源碼的、基于Lucene Java的搜索服務(wù)器,它易于安裝和配置,具有高可靠性、可擴(kuò)展性和容錯性,可提供分布式索引,復(fù)制和負(fù)載平衡查詢,自動故障轉(zhuǎn)移和恢復(fù),集中式配置等功能[4]。而且附帶了一個基于HTTP的管理界面。Solr提供分布式索引、分片、副本集、負(fù)載均衡和自動故障轉(zhuǎn)移和恢復(fù)功能。不少知名企業(yè),如AT&T,eBay,Instagram和Netfilx均使用Solr。
Elasticsearch是一個強(qiáng)大的搜索引擎,基于Apache Lucene的全文搜索引擎框架開發(fā),具有近實(shí)時、高性能、分布式和零配置的優(yōu)點(diǎn)。Elasticsearch有以下幾個關(guān)鍵的概念:
●節(jié)點(diǎn)(Node):節(jié)點(diǎn)是一個Elasticsearch的實(shí)例,一般一臺主機(jī)上部署一個節(jié)點(diǎn)
●集群(Cluster):集群由若干節(jié)點(diǎn)組成,和任意節(jié)點(diǎn)的通信等價于和集群的通信
●分片(Shard):一個索引會分成多個分片存儲,分片數(shù)量在索引建立后不可更改
●副本(Replica):副本是分片的一個拷貝,目的在于提高系統(tǒng)的容錯性和搜索的效率
●索引(Index):類似數(shù)據(jù)庫的庫
●類型(Type):類似數(shù)據(jù)庫的表
●文檔(Document):類似數(shù)據(jù)庫的行,包含一個或多個Field
●字段(Field):搜索的最小單元,可通過Mapping定義不同的屬性(比如類型,可否被搜索等)
Elasticsearch的部署屬于一鍵式的,只需解壓從官網(wǎng)下載的壓縮包并運(yùn)行bin目錄下的elasticsearch程序即可(前提是本機(jī)已配置好JDK),一旦在多臺主機(jī)上啟動擁有同一個cluster.name的Elasticsearch實(shí)例,它們會自動組成一個集群,無需其他操作,自動實(shí)現(xiàn)分布式集群。
Elasticsearch通過對JSON格式的文檔進(jìn)行索引,不僅支持并自動識別string、num、bool等常規(guī)字段,同時對于特殊字段如地理位置類型([lat,lon])和 ip(192.168.0.1)類型的字段提供特殊支持,只需在索引前手動指定相應(yīng)字段為geo或者ip字段。在索引方面Elasticsearch提供了批量索引的工具,大大提高了索引及更新效率,在數(shù)據(jù)檢索方面不僅可以提供全文索引,還提供類似關(guān)系型數(shù)據(jù)庫的結(jié)構(gòu)化檢索(Structured Query DSL)。
Elasticsearch的分布式模式默認(rèn)情況下分片數(shù)量設(shè)置為5,并配置有1份復(fù)制項,在組成集群的情況下,分片會按照一定的算法存儲在集群的各臺主機(jī)上,以確保其中一臺主機(jī)意外下線不會影響整個集群的正常工作,如下圖所示,由Dremqueen,Fin,Tarot為3個節(jié)點(diǎn)組成的Elasticsearch集群,以索引test100w為例,索引分成了5個分片,并且每個分片都有一個冗余分片。
圖1 Elasticsearch分片存儲情況
Solr是一種開放源碼的、基于Lucene Java的搜索引擎,易于嵌入到Web應(yīng)用中。Solr提供了全文搜索、聚類搜索、高亮顯示等功能,支持多種輸出格式(XML/XSLT和JSON等格式),且自帶一個基于HTTP的管理界面。
Solr需使用Tomcat運(yùn)行,或使用內(nèi)置的Jetty容器直接運(yùn)行;使用Solr需新建core(類似實(shí)例),core內(nèi)可直接插入文檔,不同的core之間沒有任何關(guān)系和影響;每個core有單獨(dú)的存儲路徑、配置文件;文檔有批量導(dǎo)入的和使用HTTP新增的方式,批量導(dǎo)入可直接用post請求將文件發(fā)送至Solr,建立索引,HTTP新增可設(shè)置若干個文檔提交一次;索引文件與Lucene的相同,可使用Luke等工具打開和查看。Solr功能特點(diǎn)如下:
Solr索引的實(shí)現(xiàn)是用POST方法向Solr服務(wù)器發(fā)送一個描述Field及其內(nèi)容的XML文檔,Solr根據(jù)XML文檔添加、刪除、更新索引。因此Solr不支持對基本字段的自動識別,且嵌套結(jié)構(gòu)的JSON文檔無法直接在Solr中進(jìn)行索引,需將JSON文檔扁平化(成為只有1級的文檔)后才能進(jìn)行索引操作。Solr搜索只需要發(fā)送HTTPGET請求,然后對Solr返回XML、JSON等格式的查詢結(jié)果進(jìn)行解析,組織頁面布局。Solr不提供構(gòu)建UI的功能,Solr提供了一個管理界面,通過管理界面可以查詢Solr的配置和運(yùn)行情況。
Solr自帶的示例分布式啟動命令為“solr start-e cloud-noprompt”,啟動后會自動在本機(jī)創(chuàng)建2個shard的分布式架構(gòu)Solr,管理界面如下圖:
圖2 Solr分布式集群管理界面
用來進(jìn)行測試的主機(jī)配置如下:
CPU:Intel Xeon E7-4807,1.87GHz
MEM:8GB
DISK:HDD 40GB
測試工具與數(shù)據(jù)如下:
LoadRunner,使用兩臺Windows7臺式機(jī)作為運(yùn)行Vuser虛擬用戶的壓力測試機(jī);
共有100W條文檔,其中包含3種格式,數(shù)量分別為40W、30W、30W。文檔的數(shù)字、時間部分為隨機(jī)生成,文本部分為從大量電子書中隨機(jī)選取,標(biāo)簽部分為從數(shù)百個詞語中隨機(jī)選??;
例如,在教學(xué)《有理數(shù)》(北師大版數(shù)學(xué)七年級上冊)這一課時,教師就可以制作一節(jié)相關(guān)的微課,詳細(xì)講解如何通過有理數(shù)去探究勾股定理,不僅讓學(xué)生對有理數(shù)的各種知識有著充分的了解,還可以學(xué)習(xí)到未來需要學(xué)習(xí)的知識。通過這樣的方式進(jìn)行教學(xué),可以使課堂教學(xué)內(nèi)容有效擴(kuò)展,為學(xué)生未來的學(xué)習(xí)打下堅實(shí)的基礎(chǔ),切實(shí)提升數(shù)學(xué)教學(xué)質(zhì)量,提升學(xué)生的學(xué)習(xí)效率。
關(guān)鍵詞詞庫,包含50W詞語,其中中文詞語約40W個、數(shù)字10W個、英文單詞約1.5W個;
地理搜索條件、時間段范圍、數(shù)值范圍各30個,其中地理搜索包括20個圓形(按距離搜索)和10個多邊形。
測試項如表1所示:
表1
(1)索引建立和更新速度對比
表2
由上表可以看出Elasticsearch的索引建立和更新速度要優(yōu)于Solr。
(2)檢索速度對比
圖3 關(guān)鍵字搜索響應(yīng)速度對比
圖4 模糊搜索響應(yīng)速度對比
本文通過簡要介紹開源搜索引擎Elasticsearch和Solr,對二者所支持的索引和檢索方法進(jìn)行了闡述,并通過對其索引和檢索性能進(jìn)行多方面比較,為項目開發(fā)人員依據(jù)自身項目的需要選擇合適的搜索引擎提供了依據(jù)。
參考文獻(xiàn):
[1]F.Ohhorst.Turning Big Data Into BigMoney.Big Data Analytics,,New Jersey,AB.D.,2013.
[2]S.Ramamorthy,S.Rajalakshmi.Optimize d Data Analysis in Cloud using BigData Analytics Techniques.4th ICCCNT Conferense,Tiruchengode,India,2013.
[3]https://www.elastic.co/guide/en/elasticsearch/reference/current/_basic_concepts.html
[4]http://lucene.apache.org/solr/guide/7_1/solr-tutorial.html.