-
1 # 網路圈
-
2 # 軟體新視界
一.ElasticSearch介紹
ElasticSearch 是一個分散式、高擴充套件、高實時的搜尋與資料分析引擎。它能很方便的使大量資料具有搜尋、分析和探索的能力。充分利用ElasticSearch的水平伸縮性,能使資料在生產環境變得更有價值。ElasticSearch 的實現原理主要分為以下幾個步驟,首先使用者將資料提交到Elastic Search 資料庫中,再透過分詞控制器去將對應的語句分詞,將其權重和分詞結果一併存入資料,當用戶搜尋資料時候,再根據權重將結果排名,打分,再將返回結果呈現給使用者。
Elasticsearch可以用於搜尋各種文件。它提供可擴充套件的搜尋,具有接近實時的搜尋,並支援多租戶。”Elasticsearch是分散式的,這意味著索引可以被分成分片,每個分片可以有0個或多個副本。每個節點託管一個或多個分片,並充當協調器將操作委託給正確的分片。再平衡和路由是自動完成的。“相關資料通常儲存在同一個索引中,該索引由一個或多個主分片和零個或多個複製分片組成。一旦建立了索引,就不能更改主分片的數量。
Elasticsearch是一個開源的高擴充套件的分散式全文檢索引擎,它可以近乎實時的儲存、檢索資料;本身擴充套件性很好,可以擴充套件到上百臺伺服器,處理PB級別的資料。
Elasticsearch也使用Java開發並使用Lucene作為其核心來實現所有索引和搜尋的功能,但是它的目的是透過簡單的RESTful API來隱藏Lucene的複雜性,從而讓全文搜尋變得簡單。
Elasticsearch基本概念
1)全文搜尋(Full-text Search)
全文檢索是指計算機索引程式透過掃描文章中的每一個詞,對每一個詞建立一個索引,指明該詞在文章中出現的次數和位置,當用戶查詢時,檢索程式就根據事先建立的索引進行查詢,並將查詢的結果反饋給使用者的檢索方式。
2)倒排索引(Inverted Index)
該索引表中的每一項都包括一個屬性值和具有該屬性值的各記錄的地址。由於不是由記錄來確定屬性值,而是由屬性值來確定記錄的位置,因而稱為倒排索引(inverted index)。Elasticsearch能夠實現快速、高效的搜尋功能,正是基於倒排索引原理。
3)節點 & 叢集(Node & Cluster)
Elasticsearch 本質上是一個分散式資料庫,允許多臺伺服器協同工作,每臺伺服器可以執行多個Elasticsearch例項。單個Elasticsearch例項稱為一個節點(Node),一組節點構成一個叢集(Cluster)。
4)索引(Index)
Elasticsearch 資料管理的頂層單位就叫做 Index(索引),相當於關係型資料庫裡的資料庫的概念。另外,每個Index的名字必須是小寫。
5)文件(Document)
Index裡面單條的記錄稱為 Document(文件)。許多條 Document 構成了一個 Index。Document 使用 JSON 格式表示。同一個 Index 裡面的 Document,不要求有相同的結構(scheme),但是最好保持相同,這樣有利於提高搜尋效率。
6)型別(Type)
Document 可以分組,比如employee這個 Index 裡面,可以按部門分組,也可以按職級分組。這種分組就叫做 Type,它是虛擬的邏輯分組,用來過濾 Document,類似關係型資料庫中的資料表。
不同的 Type 應該有相似的結構(Schema),性質完全不同的資料(比如 products 和 logs)應該存成兩個 Index,而不是一個 Index 裡面的兩個 Type(雖然可以做到)。
7)文件元資料(Document metadata)
文件元資料為_index, _type, _id, 這三者可以唯一表示一個文件,_index表示文件在哪存放,_type表示文件的物件類別,_id為文件的唯一標識。
8)欄位(Fields)
每個Document都類似一個JSON結構,它包含了許多欄位,每個欄位都有其對應的值,多個欄位組成了一個 Document,可以類比關係型資料庫資料表中的欄位。
二.MongoDB介紹MongoDB是一個基於分散式檔案儲存的資料庫。由C++語言編寫。旨在為WEB應用提供可擴充套件的高效能資料儲存解決方案。
MongoDB是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。它支援的資料結構非常鬆散,是類似JSON的BSON格式,因此可以儲存比較複雜的資料型別。Mongo最大的特點是它支援的查詢語言非常強大,其語法有點類似於面向物件的查詢語言,幾乎可以實現類似關係資料庫單表查詢的絕大部分功能,而且還支援對資料建立索引。
MongoDB基本概念
資料庫
一個MongoDB中可以建立多個數據庫。
MongoDB的預設資料庫為"db",該資料庫儲存在data目錄中。
MongoDB的單個例項可以容納多個獨立的資料庫,每一個都有自己的集合和許可權,不同的資料庫也放置在不同的檔案中。
文件
文件是一組鍵值(key-value)對(即BSON)。MongoDB 的文件不需要設定相同的欄位,並且相同的欄位不需要相同的資料型別,這與關係型資料庫有很大的區別,也是 MongoDB 非常突出的特點。比如說{“username”}
需要注意的是:
文件中的鍵/值對是有序的。
文件中的值不僅可以是在雙引號裡面的字串,還可以是其他幾種資料型別(甚至可以是整個嵌入的文件)。
MongoDB區分型別和大小寫。
MongoDB的文件不能有重複的鍵。
文件的鍵是字串。除了少數例外情況,鍵可以使用任意UTF-8字元。
文件鍵命名規範:
鍵不能含有\0 (空字元)。這個字元用來表示鍵的結尾。
.和$有特別的意義,只有在特定環境下才能使用。
以下劃線"_"開頭的鍵是保留的(不是嚴格要求的)。
集合
集合就是 MongoDB 文件組,類似於 RDBMS (關係資料庫管理系統:Relational Database Management System)中的表格。
集合存在於資料庫中,集合沒有固定的結構,這意味著你在對集合可以插入不同格式和型別的資料,但通常情況下我們插入集合的資料都會有一定的關聯性。
三.ElasticSearch和MongoDB優缺點分析MongoDB的特點和適用場景
1. 實用性
MongoDB是一個面向文件的資料庫,它並不是關係型資料庫,直接存取BSON,這意味著MongoDB更加靈活,因為可以在文件中直接插入陣列之類的複雜資料型別,並且文件的key和value不是固定的資料型別和大小,所以開發者在使用MongoDB時無須預定義關係型資料庫中的”表”等資料庫物件,設計資料庫將變得非常方便,可以大大地提升開發進度。
2. 可用性和負載均衡
MongoDB在高可用和讀負載均衡上的實現非常簡潔和友好,MongoDB自帶了副本集的概念,透過設計適合自己業務的副本集和驅動程式,可以非常有效和方便地實現高可用,讀負載均衡。而在其他資料庫產品中想實現以上功能,往往需要額外安裝複雜的中介軟體,大大提升了系統複雜度,故障排查難度和運維成本。
3. 擴充套件性
在擴充套件性方面,假設應用資料增長非常迅猛的話,透過不斷地新增磁碟容量和記憶體容量往往是不現實的,而手工的分庫分表又會帶來非常繁重的工作量和技術複雜度。在擴充套件性上,MongoDB有非常有效的,現成的解決方案。透過自帶的Mongos叢集,只需要在適當的時候繼續新增Mongo分片,就可以實現程式段自動水平擴充套件和路由,一方面緩解單個節點的讀寫壓力,另外一方面可有效地均衡磁碟容量的使用情況。整個mongos叢集對應用層完全透明,並可完美地做到各個Mongos叢集元件的高可用性。
4. 資料壓縮
自從MongoDB 3.0推出以後,MongoDB引入了一個高效能的儲存引擎WiredTiger,並且它在資料壓縮效能上得到了極大的提升,跟之前的MMAP引擎相比,壓縮比至少可增加5倍以上,可以極大地改善磁碟空間使用率。
5. 其他特性
相比其他關係型資料庫,MongoDB引入了”固定集合”的概念。所謂固定集合,就是指整個集合的大小是預先定義並固定的,內部就是一個迴圈佇列,假如集合滿了,MongoDB後臺會自動去清理舊資料,並且由於每次都是寫入固定空間,可大大地提升寫入速度。這個特性就非常適用於日誌型應用,不用再去糾結日誌瘋狂增長的清理措施和寫入效率問題。另外需要更加精細的淘汰策略設定,還可以使用TTL索引(time-to-liveindex),即具有生命週期的索引,它允許為每條記錄設定一個過期時間,當某條記錄達到它的設定條件時可被自動刪除。
在某些LBS的應用中,使用MongoDB也有非常巨大的優勢。MongoDB支援多種型別的地理空間索引,支援多種不同型別的地理空間查詢,比如intersection,within和nearness等。
6. MongoDB不適用的應用場景
在某些場景下,MongoDB作為一個非關係型資料庫有其侷限性。MongoDB不支援事務操作,所以需要用到事務的應用建議不用MongoDB,另外MongoDB目前不支援join操作,需要複雜查詢的應用也不建議使用MongoDB。
ElasticSearch功能特點和優勢
1. Elasticsearch的功能
1)分散式的搜尋引擎和資料分析引擎
搜尋:百度,網站的站內搜尋,IT系統的檢索
資料分析:電商網站,最近7天牙膏這種商品銷量排名前10的商家有哪些;新聞網站,最近1個月訪問量排名前3的新聞版塊是哪些
分散式,搜尋,資料分析
2)全文檢索,結構化檢索,資料分析
全文檢索:我想搜尋商品名稱包含牙膏的商品,select * from products where product_name like “%牙膏%”
結構化檢索:我想搜尋商品分類為日化用品的商品都有哪些,select * from products where category_id=‘日化用品’
部分匹配、自動完成、搜尋糾錯、搜尋推薦
資料分析:我們分析每一個商品分類下有多少個商品,select category_id,count(*) from products group by category_id
3)對海量資料進行近實時的處理
分散式:ES自動可以將海量資料分散到多臺伺服器上去儲存和檢索
海聯資料的處理:分散式以後,就可以採用大量的伺服器去儲存和檢索資料,自然而然就可以實現海量資料的處理了
近實時:檢索個數據要花費1小時(這就不要近實時,離線批處理,batch-processing);在秒級別對資料進行搜尋和分析
跟分散式/海量資料相反的:Lucene,單機應用,只能在單臺伺服器上使用,最多隻能處理單臺伺服器可以處理的資料量
2. Elasticsearch的適用場景
維基百科,類似百度百科,牙膏,牙膏的維基百科,全文檢索,高亮,搜尋推薦
GitHub(開原始碼管理),搜尋上千億行程式碼
電商網站,檢索商品
日誌資料分析,Logstash採集日誌,ES進行復雜的資料分析(ELK技術,Elasticsearch+LogStash+Kibana)
商品價格監控網站,使用者設定某商品的價格閾值,當低於該閾值的時候,傳送通知訊息給使用者,比如說訂閱牙膏的監控,如果高露潔牙膏的家庭套裝低於50塊錢,就通知我,我就去買
BI系統,商業智慧,Business Intelligence。
比如說有個大型商場集團,BI,分析一下某某區域最近3年的使用者消費金額的趨勢以及使用者群體的組成構成,產出相關的數張報表,**區,最近3年,每年消費金額呈現100%的增長,而且使用者群體85%是高階白領,開一個新商場。ES執行資料分析和挖掘,Kibana進行資料視覺化
國內:站內搜尋(電商,招聘,門戶,等等),IT系統搜尋(OA,CRM,ERP,等等),資料分析(ES熱門的一個使用場景)
3. Elasticsearch的特點
1)支援分散式叢集
可以作為一個大型分散式叢集(數百臺伺服器)技術,處理PB級資料,服務大公司;也可以執行在單機上,服務小公司。
2)支援將全文檢索、資料分析以及分散式
Elasticsearch不是什麼新技術,主要是將全文檢索、資料分析以及分散式技術,合併在了一起,才形成了獨一無二的ES;lucene(全文檢索),商用的資料分析軟體(也是有的),分散式資料庫(mycat)
3)開箱即用的,非常簡單
對使用者而言,是開箱即用的,非常簡單,作為中小型的應用,直接3分鐘部署一下ES,就可以作為生產環境的系統來使用了,資料量不大,操作不是太複雜
4)不支援事務,還有各種聯機事務型的操作
資料庫的功能面對很多領域是不夠用的(事務,還有各種聯機事務型的操作);
5)特殊的功能
比如全文檢索,同義詞處理,相關度排名,複雜資料分析,海量資料的近實時處理;Elasticsearch作為傳統資料庫的一個補充,提供了資料庫所不不能提供的很多功能
四.應用場景和實戰對比MongoDB:併發查詢效能較好,索引方式較為傳統,適合做高併發量業務後端資料庫。偏向於大資料規模下的CRUD,適用於對事務要求不強的OLTP系統。
ElasticSearch:對於聚合分析處理的效能極好,對於海量資料聚合分析相關的業務優選該資料庫。偏向於檢索、查詢、資料分析,適用於OLAP系統。
ElasticSearch是java編寫,透過RESTFul介面操作資料。MongoDB是C++編寫,透過driver操作資料。
MongoDB的分片有hash和range兩種方式,ElasticSearch只有hash一種。
ElasticSearch是天生分散式,主副分片自動分配和複製,開箱即用。MongoDB的分散式是由“前置查詢路由+配置服務+shard集合”,需要手動配置叢集服務。
內部儲存ES是到排索引+docvalues+fielddata。MongoDB暫時未知。
ElasticSearch全文檢索有強大的分析器且可以靈活組合,查詢時智慧匹配。MongoDB的全文檢索欄位個數有限制。
ElasticSearch所有欄位自動索引,MongoDB的欄位需要手動索引。
ElasticSearch非實時有資料丟失視窗。MongoDB實時理論上無資料丟失風險。
最近做一個資訊抓取的專案:“需求很簡單,就是把資訊取回來,存在資料庫裡,可以搜尋“,一開始先用mongodb,但是mongodb的搜尋太弱了,就打算用elasticsearch(基於lucene的)做搜尋。可能我漸漸產生一個疑惑:為什麼要用mongodb,可不可以用elasticsearch代替?elasticsearch在資料的安全性、備份、匯出到SQL資料庫等方面怎麼樣?
回覆列表
首先需要明確一點的是,ElasticSearch和MongoDB是不同的技術選型,兩者定位不同,是不能混為一談和相互替代的。
ElasticSearch是企業級搜尋引擎ElasticSearch是用Java語言基於Lucene開發的分散式搜尋伺服器,對外提供RESTful API,而且慢慢演變成了資料分析和視覺化系統(如:ELK)。
ES可以當成是一種特殊的NoSQL。
優點:查詢效能高、高效分詞、支援各類複雜檢索、支援海量資料儲存;
缺點:資料寫入效能差、缺乏許可權機制、mapping一旦確定就不好變更(索引重建很麻煩)、field是可以動態新增的不利於資料規範。MongoDB是一款NoSQL資料庫MongoDB是用C++開發的一款NoSQL資料庫(面向文件的資料庫,BSON格式儲存),雖然支援搜尋功能,但是索引效能和精確度遠不如ElasticSearch。
優點:資料寫入效能優於ElasticSearch(但比不上Redis)、資料約束性強、完善的許可權機制;
缺點:只適合資料儲存、雖有全文檢索但一個集合只能建立一個全文索引。
兩者通常搭配使用在實際專案中,我們通常是將ElasticSearch和MongoDB搭配使用的。MongoDB可作為持久化資料儲存倉庫,而ElasticSearch作複雜檢索工作。千萬不要把ES當資料庫來使用,因為ES資料結構是不嚴謹的,一旦涉及索引重建資料全部會丟失,另外也匯出不了SQL。