ElasticSearch和mongodb的对比
一.ElasticSearch介紹
ElasticSearch 是一個分布式、高擴展、高實時的搜索與數(shù)據(jù)分析引擎。它能很方便的使大量數(shù)據(jù)具有搜索、分析和探索的能力。充分利用ElasticSearch的水平伸縮性,能使數(shù)據(jù)在生產(chǎn)環(huán)境變得更有價值。ElasticSearch 的實現(xiàn)原理主要分為以下幾個步驟,首先用戶將數(shù)據(jù)提交到Elastic Search 數(shù)據(jù)庫中,再通過分詞控制器去將對應(yīng)的語句分詞,將其權(quán)重和分詞結(jié)果一并存入數(shù)據(jù),當用戶搜索數(shù)據(jù)時候,再根據(jù)權(quán)重將結(jié)果排名,打分,再將返回結(jié)果呈現(xiàn)給用戶。
Elasticsearch可以用于搜索各種文檔。它提供可擴展的搜索,具有接近實時的搜索,并支持多租戶?!盓lasticsearch是分布式的,這意味著索引可以被分成分片,每個分片可以有0個或多個副本。每個節(jié)點托管一個或多個分片,并充當協(xié)調(diào)器將操作委托給正確的分片。再平衡和路由是自動完成的。“相關(guān)數(shù)據(jù)通常存儲在同一個索引中,該索引由一個或多個主分片和零個或多個復制分片組成。一旦創(chuàng)建了索引,就不能更改主分片的數(shù)量。
Elasticsearch是一個開源的高擴展的分布式全文檢索引擎,它可以近乎實時的存儲、檢索數(shù)據(jù);本身擴展性很好,可以擴展到上百臺服務(wù)器,處理PB級別的數(shù)據(jù)。
Elasticsearch也使用Java開發(fā)并使用Lucene作為其核心來實現(xiàn)所有索引和搜索的功能,但是它的目的是通過簡單的RESTful API來隱藏Lucene的復雜性,從而讓全文搜索變得簡單。
Elasticsearch基本概念
1)全文搜索(Full-text Search)
全文檢索是指計算機索引程序通過掃描文章中的每一個詞,對每一個詞建立一個索引,指明該詞在文章中出現(xiàn)的次數(shù)和位置,當用戶查詢時,檢索程序就根據(jù)事先建立的索引進行查找,并將查找的結(jié)果反饋給用戶的檢索方式。
2)倒排索引(Inverted Index)
該索引表中的每一項都包括一個屬性值和具有該屬性值的各記錄的地址。由于不是由記錄來確定屬性值,而是由屬性值來確定記錄的位置,因而稱為倒排索引(inverted index)。Elasticsearch能夠?qū)崿F(xiàn)快速、高效的搜索功能,正是基于倒排索引原理。
3)節(jié)點 & 集群(Node & Cluster)
Elasticsearch 本質(zhì)上是一個分布式數(shù)據(jù)庫,允許多臺服務(wù)器協(xié)同工作,每臺服務(wù)器可以運行多個Elasticsearch實例。單個Elasticsearch實例稱為一個節(jié)點(Node),一組節(jié)點構(gòu)成一個集群(Cluster)。
4)索引(Index)
Elasticsearch 數(shù)據(jù)管理的頂層單位就叫做 Index(索引),相當于關(guān)系型數(shù)據(jù)庫里的數(shù)據(jù)庫的概念。另外,每個Index的名字必須是小寫。
5)文檔(Document)
Index里面單條的記錄稱為 Document(文檔)。許多條 Document 構(gòu)成了一個 Index。Document 使用 JSON 格式表示。同一個 Index 里面的 Document,不要求有相同的結(jié)構(gòu)(scheme),但是最好保持相同,這樣有利于提高搜索效率。
6)類型(Type)
Document 可以分組,比如employee這個 Index 里面,可以按部門分組,也可以按職級分組。這種分組就叫做 Type,它是虛擬的邏輯分組,用來過濾 Document,類似關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)表。
不同的 Type 應(yīng)該有相似的結(jié)構(gòu)(Schema),性質(zhì)完全不同的數(shù)據(jù)(比如 products 和 logs)應(yīng)該存成兩個 Index,而不是一個 Index 里面的兩個 Type(雖然可以做到)。
7)文檔元數(shù)據(jù)(Document metadata)
文檔元數(shù)據(jù)為_index, _type, _id, 這三者可以唯一表示一個文檔,_index表示文檔在哪存放,_type表示文檔的對象類別,_id為文檔的唯一標識。
8)字段(Fields)
每個Document都類似一個JSON結(jié)構(gòu),它包含了許多字段,每個字段都有其對應(yīng)的值,多個字段組成了一個 Document,可以類比關(guān)系型數(shù)據(jù)庫數(shù)據(jù)表中的字段。
二.MongoDB介紹
MongoDB是一個基于分布式文件存儲的數(shù)據(jù)庫。由C++語言編寫。旨在為WEB應(yīng)用提供可擴展的高性能數(shù)據(jù)存儲解決方案。
MongoDB是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。它支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似JSON的BSON格式,因此可以存儲比較復雜的數(shù)據(jù)類型。Mongo最大的特點是它支持的查詢語言非常強大,其語法有點類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對數(shù)據(jù)建立索引。
MongoDB基本概念
數(shù)據(jù)庫
一個MongoDB中可以建立多個數(shù)據(jù)庫。
MongoDB的默認數(shù)據(jù)庫為"db",該數(shù)據(jù)庫存儲在data目錄中。
MongoDB的單個實例可以容納多個獨立的數(shù)據(jù)庫,每一個都有自己的集合和權(quán)限,不同的數(shù)據(jù)庫也放置在不同的文件中。
文檔
文檔是一組鍵值(key-value)對(即BSON)。MongoDB 的文檔不需要設(shè)置相同的字段,并且相同的字段不需要相同的數(shù)據(jù)類型,這與關(guān)系型數(shù)據(jù)庫有很大的區(qū)別,也是 MongoDB 非常突出的特點。比如說{“username”}
需要注意的是:
-
文檔中的鍵/值對是有序的。
-
文檔中的值不僅可以是在雙引號里面的字符串,還可以是其他幾種數(shù)據(jù)類型(甚至可以是整個嵌入的文檔)。
-
MongoDB區(qū)分類型和大小寫。
-
MongoDB的文檔不能有重復的鍵。
-
文檔的鍵是字符串。除了少數(shù)例外情況,鍵可以使用任意UTF-8字符。
文檔鍵命名規(guī)范:
-
鍵不能含有 (空字符)。這個字符用來表示鍵的結(jié)尾。
-
.和$有特別的意義,只有在特定環(huán)境下才能使用。
-
以下劃線"_"開頭的鍵是保留的(不是嚴格要求的)。
集合
集合就是 MongoDB 文檔組,類似于 RDBMS (關(guān)系數(shù)據(jù)庫管理系統(tǒng):Relational Database Management System)中的表格。
集合存在于數(shù)據(jù)庫中,集合沒有固定的結(jié)構(gòu),這意味著你在對集合可以插入不同格式和類型的數(shù)據(jù),但通常情況下我們插入集合的數(shù)據(jù)都會有一定的關(guān)聯(lián)性。
三.ElasticSearch和MongoDB優(yōu)缺點分析
MongoDB的特點和適用場景
1. 實用性
MongoDB是一個面向文檔的數(shù)據(jù)庫,它并不是關(guān)系型數(shù)據(jù)庫,直接存取BSON,這意味著MongoDB更加靈活,因為可以在文檔中直接插入數(shù)組之類的復雜數(shù)據(jù)類型,并且文檔的key和value不是固定的數(shù)據(jù)類型和大小,所以開發(fā)者在使用MongoDB時無須預(yù)定義關(guān)系型數(shù)據(jù)庫中的”表”等數(shù)據(jù)庫對象,設(shè)計數(shù)據(jù)庫將變得非常方便,可以大大地提升開發(fā)進度。
2. 可用性和負載均衡
MongoDB在高可用和讀負載均衡上的實現(xiàn)非常簡潔和友好,MongoDB自帶了副本集的概念,通過設(shè)計適合自己業(yè)務(wù)的副本集和驅(qū)動程序,可以非常有效和方便地實現(xiàn)高可用,讀負載均衡。而在其他數(shù)據(jù)庫產(chǎn)品中想實現(xiàn)以上功能,往往需要額外安裝復雜的中間件,大大提升了系統(tǒng)復雜度,故障排查難度和運維成本。
3. 擴展性
在擴展性方面,假設(shè)應(yīng)用數(shù)據(jù)增長非常迅猛的話,通過不斷地添加磁盤容量和內(nèi)存容量往往是不現(xiàn)實的,而手工的分庫分表又會帶來非常繁重的工作量和技術(shù)復雜度。在擴展性上,MongoDB有非常有效的,現(xiàn)成的解決方案。通過自帶的Mongos集群,只需要在適當?shù)臅r候繼續(xù)添加Mongo分片,就可以實現(xiàn)程序段自動水平擴展和路由,一方面緩解單個節(jié)點的讀寫壓力,另外一方面可有效地均衡磁盤容量的使用情況。整個mongos集群對應(yīng)用層完全透明,并可完美地做到各個Mongos集群組件的高可用性。
4. 數(shù)據(jù)壓縮
自從MongoDB 3.0推出以后,MongoDB引入了一個高性能的存儲引擎WiredTiger,并且它在數(shù)據(jù)壓縮性能上得到了極大的提升,跟之前的MMAP引擎相比,壓縮比至少可增加5倍以上,可以極大地改善磁盤空間使用率。
5. 其他特性
相比其他關(guān)系型數(shù)據(jù)庫,MongoDB引入了”固定集合”的概念。所謂固定集合,就是指整個集合的大小是預(yù)先定義并固定的,內(nèi)部就是一個循環(huán)隊列,假如集合滿了,MongoDB后臺會自動去清理舊數(shù)據(jù),并且由于每次都是寫入固定空間,可大大地提升寫入速度。這個特性就非常適用于日志型應(yīng)用,不用再去糾結(jié)日志瘋狂增長的清理措施和寫入效率問題。另外需要更加精細的淘汰策略設(shè)置,還可以使用TTL索引(time-to-liveindex),即具有生命周期的索引,它允許為每條記錄設(shè)置一個過期時間,當某條記錄達到它的設(shè)置條件時可被自動刪除。
在某些LBS的應(yīng)用中,使用MongoDB也有非常巨大的優(yōu)勢。MongoDB支持多種類型的地理空間索引,支持多種不同類型的地理空間查詢,比如intersection,within和nearness等。
6. MongoDB不適用的應(yīng)用場景
在某些場景下,MongoDB作為一個非關(guān)系型數(shù)據(jù)庫有其局限性。MongoDB不支持事務(wù)操作,所以需要用到事務(wù)的應(yīng)用建議不用MongoDB,另外MongoDB目前不支持join操作,需要復雜查詢的應(yīng)用也不建議使用MongoDB。
ElasticSearch功能特點和優(yōu)勢
1. Elasticsearch的功能
1)分布式的搜索引擎和數(shù)據(jù)分析引擎
搜索:百度,網(wǎng)站的站內(nèi)搜索,IT系統(tǒng)的檢索
數(shù)據(jù)分析:電商網(wǎng)站,最近7天牙膏這種商品銷量排名前10的商家有哪些;新聞網(wǎng)站,最近1個月訪問量排名前3的新聞版塊是哪些
分布式,搜索,數(shù)據(jù)分析
2)全文檢索,結(jié)構(gòu)化檢索,數(shù)據(jù)分析
全文檢索:我想搜索商品名稱包含牙膏的商品,select * from products where product_name like “%牙膏%”
結(jié)構(gòu)化檢索:我想搜索商品分類為日化用品的商品都有哪些,select * from products where category_id=‘日化用品’
部分匹配、自動完成、搜索糾錯、搜索推薦
數(shù)據(jù)分析:我們分析每一個商品分類下有多少個商品,select category_id,count(*) from products group by category_id
3)對海量數(shù)據(jù)進行近實時的處理
分布式:ES自動可以將海量數(shù)據(jù)分散到多臺服務(wù)器上去存儲和檢索
海聯(lián)數(shù)據(jù)的處理:分布式以后,就可以采用大量的服務(wù)器去存儲和檢索數(shù)據(jù),自然而然就可以實現(xiàn)海量數(shù)據(jù)的處理了
近實時:檢索個數(shù)據(jù)要花費1小時(這就不要近實時,離線批處理,batch-processing);在秒級別對數(shù)據(jù)進行搜索和分析
跟分布式/海量數(shù)據(jù)相反的:Lucene,單機應(yīng)用,只能在單臺服務(wù)器上使用,最多只能處理單臺服務(wù)器可以處理的數(shù)據(jù)量
2. Elasticsearch的適用場景
維基百科,類似百度百科,牙膏,牙膏的維基百科,全文檢索,高亮,搜索推薦
The Guardian(國外新聞網(wǎng)站),類似搜狐新聞,用戶行為日志(點擊,瀏覽,收藏,評論)+社交網(wǎng)絡(luò)數(shù)據(jù)(對某某新聞的相關(guān)看法),數(shù)據(jù)分析,給到每篇新聞文章的作者,讓他知道他的文章的公眾反饋(好,壞,熱門,垃圾,鄙視,崇拜)
Stack Overflow(國外的程序異常討論論壇),IT問題,程序的報錯,提交上去,有人會跟你討論和回答,全文檢索,搜索相關(guān)問題和答案,程序報錯了,就會將報錯信息粘貼到里面去,搜索有沒有對應(yīng)的答案
GitHub(開源代碼管理),搜索上千億行代碼
電商網(wǎng)站,檢索商品
日志數(shù)據(jù)分析,Logstash采集日志,ES進行復雜的數(shù)據(jù)分析(ELK技術(shù),Elasticsearch+LogStash+Kibana)
商品價格監(jiān)控網(wǎng)站,用戶設(shè)定某商品的價格閾值,當?shù)陀谠撻撝档臅r候,發(fā)送通知消息給用戶,比如說訂閱牙膏的監(jiān)控,如果高露潔牙膏的家庭套裝低于50塊錢,就通知我,我就去買
BI系統(tǒng),商業(yè)智能,Business Intelligence。
比如說有個大型商場集團,BI,分析一下某某區(qū)域最近3年的用戶消費金額的趨勢以及用戶群體的組成構(gòu)成,產(chǎn)出相關(guān)的數(shù)張報表,**區(qū),最近3年,每年消費金額呈現(xiàn)100%的增長,而且用戶群體85%是高級白領(lǐng),開一個新商場。ES執(zhí)行數(shù)據(jù)分析和挖掘,Kibana進行數(shù)據(jù)可視化
國內(nèi):站內(nèi)搜索(電商,招聘,門戶,等等),IT系統(tǒng)搜索(OA,CRM,ERP,等等),數(shù)據(jù)分析(ES熱門的一個使用場景)
3. Elasticsearch的特點
1)支持分布式集群
可以作為一個大型分布式集群(數(shù)百臺服務(wù)器)技術(shù),處理PB級數(shù)據(jù),服務(wù)大公司;也可以運行在單機上,服務(wù)小公司。
2)支持將全文檢索、數(shù)據(jù)分析以及分布式
Elasticsearch不是什么新技術(shù),主要是將全文檢索、數(shù)據(jù)分析以及分布式技術(shù),合并在了一起,才形成了獨一無二的ES;lucene(全文檢索),商用的數(shù)據(jù)分析軟件(也是有的),分布式數(shù)據(jù)庫(mycat)
3)開箱即用的,非常簡單
對用戶而言,是開箱即用的,非常簡單,作為中小型的應(yīng)用,直接3分鐘部署一下ES,就可以作為生產(chǎn)環(huán)境的系統(tǒng)來使用了,數(shù)據(jù)量不大,操作不是太復雜
4)不支持事務(wù),還有各種聯(lián)機事務(wù)型的操作
數(shù)據(jù)庫的功能面對很多領(lǐng)域是不夠用的(事務(wù),還有各種聯(lián)機事務(wù)型的操作);
5)特殊的功能
比如全文檢索,同義詞處理,相關(guān)度排名,復雜數(shù)據(jù)分析,海量數(shù)據(jù)的近實時處理;Elasticsearch作為傳統(tǒng)數(shù)據(jù)庫的一個補充,提供了數(shù)據(jù)庫所不不能提供的很多功能
四.應(yīng)用場景和實戰(zhàn)對比
MongoDB:并發(fā)查詢性能較好,索引方式較為傳統(tǒng),適合做高并發(fā)量業(yè)務(wù)后端數(shù)據(jù)庫。偏向于大數(shù)據(jù)規(guī)模下的CRUD,適用于對事務(wù)要求不強的OLTP系統(tǒng)。
ElasticSearch:對于聚合分析處理的性能極好,對于海量數(shù)據(jù)聚合分析相關(guān)的業(yè)務(wù)優(yōu)選該數(shù)據(jù)庫。偏向于檢索、查詢、數(shù)據(jù)分析,適用于OLAP系統(tǒng)。
-
ElasticSearch是java編寫,通過RESTFul接口操作數(shù)據(jù)。MongoDB是C++編寫,通過driver操作數(shù)據(jù)。
-
MongoDB的分片有hash和range兩種方式,ElasticSearch只有hash一種。
-
ElasticSearch是天生分布式,主副分片自動分配和復制,開箱即用。MongoDB的分布式是由“前置查詢路由+配置服務(wù)+shard集合”,需要手動配置集群服務(wù)。
-
內(nèi)部存儲ES是到排索引+docvalues+fielddata。MongoDB暫時未知。
-
ElasticSearch全文檢索有強大的分析器且可以靈活組合,查詢時智能匹配。MongoDB的全文檢索字段個數(shù)有限制。
-
ElasticSearch所有字段自動索引,MongoDB的字段需要手動索引。
-
ElasticSearch非實時有數(shù)據(jù)丟失窗口。MongoDB實時理論上無數(shù)據(jù)丟失風險。
?mongoDB vs elasticsearch vs redis
關(guān)于大規(guī)模存儲查詢解決方案總結(jié):
http://kaimingwan.com/post/shu-ju-ku/da-gui-mo-shu-ju-cun-chu-cha-xun-jie-jue-fang-an-zong-jie
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的ElasticSearch和mongodb的对比的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 力扣刷题心得(设计类题目)
- 下一篇: 微服务【1.1】Swagger的使用