魏濤,孟方園,袁平,殷鋒
(1.四川大學計算機學院,成都 610065;2.北京衛星導航中心,北京 100094;3.重慶第二師范學院,重慶 400067;4.西南民族大學校園網絡管理中心,成都 610064)
在信息化高速發展的今天,大量的智能設備以及人類的活動通過互聯網進行計算和通信,從而在互聯網上產生了大量的信息,在這些海量的信息中既包含著對我們有用的信息,同時也充斥的大量的無用信息,用傳統的工具如關系型數據庫對這些信息進行存儲,檢索和分析顯然力不從心[1]。因此,有大量的工具被開發出來,從而為檢索和處理海量的數據提供了有效的解決辦法[2]。其中,作為同為基于全文搜索框架Apache Lucene的Elasticsearch和Solr,其主要功能相似,但在配置部署,使用及檢索性能方面存在一定的區別,本文通過對二者進行對比和分析,為項目成員對這二者搜索引擎的選擇提供參考。
Elasticsearch是一個分布式、可擴展、實時的搜索與數據分析引擎。Elasticsearch不僅可以全文搜索,同時提供結構化搜索、數據分析、復雜的語言處理、地理位置和對象間關聯關系等[3]。通過REST和schemafree的JSON文檔提供分布式、多租戶全文搜索。并且官方提供 Java,Groovy,PHP,Ruby,Perl,Python,.NET和JavaScript客戶端。許多互聯網公司使用Elastic?search作為其內部搜索引擎,如Wikipedia使用Elastic?search提供帶有高亮片段的全文搜索。衛報使用Elas?ticsearch將網絡社交數據結合到訪客日志中,實時的給它的編輯們提供公眾對于新文章的反饋。Stack Over?flow將地理位置查詢融入全文檢索中去,并且使用more-like-this接口去查找相關的問題與答案。GitHub使用Elasticsearch對1300億行代碼進行查詢。
Solr支持許多世界上最大的互聯網站點的搜索和導航功能。Solr它是一種開放源碼的、基于Lucene Java的搜索服務器,它易于安裝和配置,具有高可靠性、可擴展性和容錯性,可提供分布式索引,復制和負載平衡查詢,自動故障轉移和恢復,集中式配置等功能[4]。而且附帶了一個基于HTTP的管理界面。Solr提供分布式索引、分片、副本集、負載均衡和自動故障轉移和恢復功能。不少知名企業,如AT&T,eBay,Instagram和Netfilx均使用Solr。
Elasticsearch是一個強大的搜索引擎,基于Apache Lucene的全文搜索引擎框架開發,具有近實時、高性能、分布式和零配置的優點。Elasticsearch有以下幾個關鍵的概念:
●節點(Node):節點是一個Elasticsearch的實例,一般一臺主機上部署一個節點
●集群(Cluster):集群由若干節點組成,和任意節點的通信等價于和集群的通信
●分片(Shard):一個索引會分成多個分片存儲,分片數量在索引建立后不可更改
●副本(Replica):副本是分片的一個拷貝,目的在于提高系統的容錯性和搜索的效率
●索引(Index):類似數據庫的庫
●類型(Type):類似數據庫的表
●文檔(Document):類似數據庫的行,包含一個或多個Field
●字段(Field):搜索的最小單元,可通過Mapping定義不同的屬性(比如類型,可否被搜索等)
Elasticsearch的部署屬于一鍵式的,只需解壓從官網下載的壓縮包并運行bin目錄下的elasticsearch程序即可(前提是本機已配置好JDK),一旦在多臺主機上啟動擁有同一個cluster.name的Elasticsearch實例,它們會自動組成一個集群,無需其他操作,自動實現分布式集群。
Elasticsearch通過對JSON格式的文檔進行索引,不僅支持并自動識別string、num、bool等常規字段,同時對于特殊字段如地理位置類型([lat,lon])和 ip(192.168.0.1)類型的字段提供特殊支持,只需在索引前手動指定相應字段為geo或者ip字段。在索引方面Elasticsearch提供了批量索引的工具,大大提高了索引及更新效率,在數據檢索方面不僅可以提供全文索引,還提供類似關系型數據庫的結構化檢索(Structured Query DSL)。
Elasticsearch的分布式模式默認情況下分片數量設置為5,并配置有1份復制項,在組成集群的情況下,分片會按照一定的算法存儲在集群的各臺主機上,以確保其中一臺主機意外下線不會影響整個集群的正常工作,如下圖所示,由Dremqueen,Fin,Tarot為3個節點組成的Elasticsearch集群,以索引test100w為例,索引分成了5個分片,并且每個分片都有一個冗余分片。

圖1 Elasticsearch分片存儲情況
Solr是一種開放源碼的、基于Lucene Java的搜索引擎,易于嵌入到Web應用中。Solr提供了全文搜索、聚類搜索、高亮顯示等功能,支持多種輸出格式(XML/XSLT和JSON等格式),且自帶一個基于HTTP的管理界面。
Solr需使用Tomcat運行,或使用內置的Jetty容器直接運行;使用Solr需新建core(類似實例),core內可直接插入文檔,不同的core之間沒有任何關系和影響;每個core有單獨的存儲路徑、配置文件;文檔有批量導入的和使用HTTP新增的方式,批量導入可直接用post請求將文件發送至Solr,建立索引,HTTP新增可設置若干個文檔提交一次;索引文件與Lucene的相同,可使用Luke等工具打開和查看。Solr功能特點如下:
Solr索引的實現是用POST方法向Solr服務器發送一個描述Field及其內容的XML文檔,Solr根據XML文檔添加、刪除、更新索引。因此Solr不支持對基本字段的自動識別,且嵌套結構的JSON文檔無法直接在Solr中進行索引,需將JSON文檔扁平化(成為只有1級的文檔)后才能進行索引操作。Solr搜索只需要發送HTTPGET請求,然后對Solr返回XML、JSON等格式的查詢結果進行解析,組織頁面布局。Solr不提供構建UI的功能,Solr提供了一個管理界面,通過管理界面可以查詢Solr的配置和運行情況。
Solr自帶的示例分布式啟動命令為“solr start-e cloud-noprompt”,啟動后會自動在本機創建2個shard的分布式架構Solr,管理界面如下圖:

圖2 Solr分布式集群管理界面
用來進行測試的主機配置如下:
CPU:Intel Xeon E7-4807,1.87GHz
MEM:8GB
DISK:HDD 40GB
測試工具與數據如下:
LoadRunner,使用兩臺Windows7臺式機作為運行Vuser虛擬用戶的壓力測試機;
共有100W條文檔,其中包含3種格式,數量分別為40W、30W、30W。文檔的數字、時間部分為隨機生成,文本部分為從大量電子書中隨機選取,標簽部分為從數百個詞語中隨機選取;
例如,在教學《有理數》(北師大版數學七年級上冊)這一課時,教師就可以制作一節相關的微課,詳細講解如何通過有理數去探究勾股定理,不僅讓學生對有理數的各種知識有著充分的了解,還可以學習到未來需要學習的知識。通過這樣的方式進行教學,可以使課堂教學內容有效擴展,為學生未來的學習打下堅實的基礎,切實提升數學教學質量,提升學生的學習效率。
關鍵詞詞庫,包含50W詞語,其中中文詞語約40W個、數字10W個、英文單詞約1.5W個;
地理搜索條件、時間段范圍、數值范圍各30個,其中地理搜索包括20個圓形(按距離搜索)和10個多邊形。
測試項如表1所示:

表1
(1)索引建立和更新速度對比

表2
由上表可以看出Elasticsearch的索引建立和更新速度要優于Solr。
(2)檢索速度對比

圖3 關鍵字搜索響應速度對比

圖4 模糊搜索響應速度對比
本文通過簡要介紹開源搜索引擎Elasticsearch和Solr,對二者所支持的索引和檢索方法進行了闡述,并通過對其索引和檢索性能進行多方面比較,為項目開發人員依據自身項目的需要選擇合適的搜索引擎提供了依據。
參考文獻:
[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.