一文帶你了解Elasticsearch vs. Solr
背景
當(dāng)前是云計(jì)算和數(shù)據(jù)快速增長(zhǎng)的時(shí)代,今天的應(yīng)用程序正以PB級(jí)和ZB級(jí)的速度生產(chǎn)數(shù)據(jù),但人們依然在不停的追求更高更快的性能需求。隨著數(shù)據(jù)的堆積,如何快速有效地搜索這些數(shù)據(jù),成為對(duì)后端服務(wù)的挑戰(zhàn)。本文,我們將比較業(yè)界兩個(gè)最流行的開源搜索引擎,Solr和ElasticSearch。兩者都建立在Apache Lucene開源平臺(tái)之上,它們的主要功能非常相似,但是在部署的易用性,可擴(kuò)展性和其他功能方面也存在巨大差異。
Elastcisearch
介紹
Elasticsearch 是一個(gè)分布式、RESTful 風(fēng)格的搜索和數(shù)據(jù)分析引擎。Elasticsearch是用Java語(yǔ)言開發(fā)的,并作為Apache許可條款下的開放源碼發(fā)布,是一種流行的企業(yè)級(jí)搜索引擎。Elasticsearch 以其易用性迅速贏得了許多用戶,被用在網(wǎng)站搜索、日志分析等諸多方面。由于 ES 強(qiáng)大的橫向擴(kuò)展能力,甚至很多人也會(huì)直接把 ES 當(dāng)做 NoSQL 來(lái)用。
特性
- 搜索引擎:通過(guò) Elasticsearch,您能夠執(zhí)行及合并多種類型的搜索(結(jié)構(gòu)化數(shù)據(jù)、非結(jié)構(gòu)化數(shù)據(jù)、地理位置、指標(biāo)),搜索方式隨心而變
- 分析引擎:對(duì)的是十億行日志,Elasticsearch 聚合讓您能夠從大處著眼,探索數(shù)據(jù)的趨勢(shì)和規(guī)律
- 檢索性能:通過(guò)有限狀態(tài)轉(zhuǎn)換器實(shí)現(xiàn)了用于全文檢索的倒排索引,實(shí)現(xiàn)了用于存儲(chǔ)數(shù)值數(shù)據(jù)和地理位置數(shù)據(jù)的 BKD 樹,以及用于分析的列存儲(chǔ)
- 可擴(kuò)展性:能夠水平擴(kuò)展,每秒鐘可處理海量事件,同時(shí)能夠自動(dòng)管理索引和查詢?cè)诩褐械姆植挤绞?,以?shí)現(xiàn)極其流暢的操作
- 檢索能力:基于各項(xiàng)元素(從詞頻或新近度到熱門度等)對(duì)搜索結(jié)果進(jìn)行排序。將這些內(nèi)容與功能進(jìn)行混搭,以優(yōu)化向用戶顯示結(jié)果的方式
- 數(shù)據(jù)容錯(cuò):通過(guò)跨集群復(fù)制功能,輔助集群可以作為熱備份隨時(shí)投入使用。
- 實(shí)時(shí)互動(dòng):在 Kibana 中通過(guò)炫酷的可視化來(lái)探索您的數(shù)據(jù),從華夫餅圖到熱點(diǎn)圖,再到時(shí)序數(shù)據(jù)分析,應(yīng)有盡有
數(shù)據(jù)結(jié)構(gòu)
- index(索引):索引是文檔(Document)的容器,是一類文檔的集合,類比傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)來(lái)說(shuō),索引相當(dāng)于SQL中的一個(gè)數(shù)據(jù)庫(kù)(Database)
- Type(類型):從 6.0.0開始單個(gè)索引只能有一個(gè)類型,7.0.0以后將不建議使用,8.0.0以后完全不支持
- Document(文檔):Document Index 里面單條的記錄成為Document(文檔)。等同于關(guān)系型數(shù)據(jù)庫(kù)表中的行
- Field(字段):屬性Fieldl類似于關(guān)系型數(shù)據(jù)庫(kù)的字段的概念,一樣的,每個(gè)屬性有自己不同的類型,類型包括核心類型、復(fù)雜類型(對(duì)象類型[object]和嵌套類型[nested])、地理類型以及特殊類型
集群
Elasticsearch 可以橫向擴(kuò)展至數(shù)百(甚至數(shù)千)的服務(wù)器節(jié)點(diǎn),同時(shí)可以處理PB級(jí)數(shù)據(jù)。ElasticSearch 的主旨是隨時(shí)可用和按需擴(kuò)容。 而擴(kuò)容可以通過(guò)購(gòu)買性能更強(qiáng)大( 垂直擴(kuò)容 ,或 縱向擴(kuò)容 ) 或者數(shù)量更多的服務(wù)器( 水平擴(kuò)容 ,或 橫向擴(kuò)容 )來(lái)實(shí)現(xiàn)。雖然 Elasticsearch 可以獲益于更強(qiáng)大的硬件設(shè)備,但是垂直擴(kuò)容是有極限的。 真正的擴(kuò)容能力是來(lái)自于水平擴(kuò)容—為集群添加更多的節(jié)點(diǎn),并且將負(fù)載壓力和穩(wěn)定性分散到這些節(jié)點(diǎn)中。對(duì)于大多數(shù)的數(shù)據(jù)庫(kù)而言,通常需要對(duì)應(yīng)用程序進(jìn)行非常大的改動(dòng),才能利用上橫向擴(kuò)容的新增資源。與之相反的是,ElastiSearch天生就是 分布式的 ,它知道如何通過(guò)管理多節(jié)點(diǎn)來(lái)提高擴(kuò)容性和可用性。 這也意味著你的應(yīng)用無(wú)需關(guān)注這個(gè)問(wèn)題 。
集群支持如下功能:
- 集群健康
- 故障轉(zhuǎn)移
- 水平擴(kuò)容
- 應(yīng)對(duì)故障
Solr
介紹
Solr是一個(gè)高性能,采用Java開發(fā),基于Lucene的全文搜索服務(wù)器。同時(shí)對(duì)其進(jìn)行了擴(kuò)展,提供了比Lucene更為豐富的查詢語(yǔ)言,同時(shí)實(shí)現(xiàn)了可配置、可擴(kuò)展并對(duì)查詢性能進(jìn)行了優(yōu)化,并且提供了一個(gè)完善的功能管理界面,是一款非常優(yōu)秀的全文搜索引擎。Apache Solr 是一個(gè)成熟的項(xiàng)目,于 2006 年首次發(fā)布到開源,Solr 在搜索領(lǐng)域占據(jù)了多年的主導(dǎo)地位。然后,在 2010 年左右,Elasticsearch 成為市場(chǎng)上的另一種選擇。
特點(diǎn)
- RESTful API: 要與Solr通信,可以使用RESTful服務(wù)與Solr通信,可以使用XML,JSON,CSV等格式的文件作為輸入文檔,并以相同的文件格式獲取結(jié)果
- 全文搜索: Solr提供了全文搜索所需的所有功能:令牌,短語(yǔ),拼寫檢查,通配符,自動(dòng)完成
- 企業(yè)準(zhǔn)備: 根據(jù)企業(yè)或組織的需要,Solr可以部署在任何類型的系統(tǒng):獨(dú)立,分布式,云
- 靈活可擴(kuò)展: 通過(guò)擴(kuò)展Java類并進(jìn)行相關(guān)配置,可以定制Solr組件
- NoSQL數(shù)據(jù)庫(kù): Solr可以用作大數(shù)量級(jí)的NoSQL數(shù)據(jù)庫(kù),可以沿著集群分布搜索任務(wù)
架構(gòu)
Apache Solr的主要構(gòu)建塊(組件)
- 請(qǐng)求處理程序 - 發(fā)送到Apache Solr的請(qǐng)求由這些請(qǐng)求處理程序處理。請(qǐng)求可以是查詢請(qǐng)求或索引更新請(qǐng)求。根據(jù)這些請(qǐng)示的要求來(lái)選擇請(qǐng)求處理程序。為了將請(qǐng)求傳遞給Solr,通常將處理器映射到某個(gè)URI端點(diǎn),并且它將為指定的請(qǐng)求提供服務(wù)。
- 搜索組件 - 搜索組件是Apache Solr中提供的搜索類型(功能)。它可能是拼寫檢查,查詢,構(gòu)面,命中突出顯示等。這些搜索組件被注冊(cè)為搜索處理程序。多個(gè)組件可以注冊(cè)到搜索處理程序。
- 查詢解析器 ? Apache Solr查詢解析器解析傳遞給Solr的查詢,并驗(yàn)證查詢的語(yǔ)法是否有錯(cuò)誤。解析查詢后,將它們轉(zhuǎn)換為L(zhǎng)ucene理解的格式。
- 響應(yīng)寫入器 - Apache Solr中的響應(yīng)寫入器是為用戶查詢生成格式化輸出的組件。 Solr支持XML,JSON,CSV等響應(yīng)格式。對(duì)每種類型的響應(yīng)都有不同的響應(yīng)寫入。
- 分析器/分詞器 - Lucene以令牌的形式識(shí)別數(shù)據(jù)。 Apache Solr分析內(nèi)容,將其分成令牌,并將這些令牌傳遞給Lucene。 Apache Solr中的分析器檢查字段的文本并生成令牌流。分詞器將分析器準(zhǔn)備的令牌流分解成令牌。
- 更新請(qǐng)求處理器 - 每當(dāng)向Apache Solr發(fā)送更新請(qǐng)求時(shí),請(qǐng)求都通過(guò)一組稱為更新請(qǐng)求處理器的插件(簽名,日志記錄,索引)運(yùn)行。這個(gè)處理器負(fù)責(zé)修改,例如刪除字段,添加字段等。
總結(jié)
Solr專注于文本搜索,而Elasticsearch則常用于查詢、過(guò)濾和分組分析統(tǒng)計(jì)。那么,到底是選擇 Solr 還是 Elasticsearch?有時(shí)很難找到明確的答案。無(wú)論選擇 Solr 還是 Elasticsearch,首先需要了解正確的用例和未來(lái)需求,總結(jié)它們的每個(gè)屬性。
- 如果需要分布式索引,則需要選擇 Elasticsearch。對(duì)于需要良好可伸縮性和性能的云和分布式環(huán)境,Elasticsearch 是更好的選擇。
- 在Solr中,索引間進(jìn)行join必須是單個(gè)分片和其他節(jié)點(diǎn)上的副本集進(jìn)行關(guān)聯(lián)來(lái)搜索文檔間關(guān)系(例如SQL連接)。而Elasticsearch提供更高效的has_children和top_children查詢來(lái)檢索這樣的相關(guān)文檔。
- 兩者都有很好的操作工具,盡管 Elasticsearch 因其易于使用的 API 而更多地吸引了 DevOps 人群,因此可以圍繞它創(chuàng)建一個(gè)更加生動(dòng)的工具生態(tài)系統(tǒng)。
- Elasticsearch 在開源日志管理用例中占據(jù)主導(dǎo)地位,許多組織在 Elasticsearch 中索引它們的日志以使其可搜索。雖然 Solr 現(xiàn)在也可以用于此目的,但它只是錯(cuò)過(guò)了這一想法。
- Solr 仍然更加面向文本搜索。另一方面,Elasticsearch 通常用于過(guò)濾和分組,分析查詢工作負(fù)載,而不一定是文本搜索。
- Elasticsearch 開發(fā)人員在 Lucene 和 Elasticsearch 級(jí)別上投入了大量精力使此類查詢更高效(降低內(nèi)存占用和 CPU 使用)。因此,對(duì)于不僅需要進(jìn)行文本搜索,而且需要復(fù)雜的搜索時(shí)間聚合的應(yīng)用程序,Elasticsearch 是一個(gè)更好的選擇。
- Elasticsearch 更容易上手,一個(gè)下載和一個(gè)命令就可以啟動(dòng)一切。Solr 傳統(tǒng)上需要更多的工作和知識(shí),但 Solr 最近在消除這一點(diǎn)上取得了巨大的進(jìn)步,現(xiàn)在只需努力改變它的聲譽(yù)。
- 從操作上講,Elasticsearch 使用起來(lái)比較簡(jiǎn)單,它只有一個(gè)進(jìn)程。Solr 在其類似 Elasticsearch 的完全分布式部署模式 SolrCloud 中依賴于 Apache ZooKeeper,ZooKeeper 是超級(jí)成熟,超級(jí)廣泛使用等等,但它仍然是另一個(gè)活躍的部分。雖然 Elasticsearch 內(nèi)置了類似 ZooKeeper 的組件 Xen,但 ZooKeeper 可以更好地防止有時(shí)在 Elasticsearch 集群中出現(xiàn)的可怕的裂腦問(wèn)題。
- Solr接受來(lái)自不同來(lái)源的數(shù)據(jù),包括XML文件,逗號(hào)分隔符(CSV)文件和從數(shù)據(jù)庫(kù)中的表提取的數(shù)據(jù)以及常見的文件格式(如Microsoft Word和PDF)。Elasticsearch還支持其他來(lái)源的數(shù)據(jù),例如Git,JDBC,JMS,Kafka,LDAP,MongoDB等。還有各種插件可用。