{eval=Array;=+count(Array);}
首先需要明確一點的是,ElasticSearch和MongoDB是不同的技術選型,兩者定位不同,是不能混為一談和相互替代的。
ElasticSearch是用Java語言基于Lucene開發的分布式搜索服務器,對外提供RESTful API,而且慢慢演變成了數據分析和可視化系統(如:ELK)。
ES可以當成是一種特殊的NoSQL。
優點:查詢性能高、高效分詞、支持各類復雜檢索、支持海量數據存儲;
MongoDB是用C++開發的一款NoSQL數據庫(面向文檔的數據庫,BSON格式存儲),雖然支持搜索功能,但是索引性能和精確度遠不如ElasticSearch。
優點:數據寫入性能優于ElasticSearch(但比不上Redis)、數據約束性強、完善的權限機制;
缺點:只適合數據存儲、雖有全文檢索但一個集合只能創建一個全文索引。
在實際項目中,我們通常是將ElasticSearch和MongoDB搭配使用的。MongoDB可作為持久化數據存儲倉庫,而ElasticSearch作復雜檢索工作。千萬不要把ES當數據庫來使用,因為ES數據結構是不嚴謹的,一旦涉及索引重建數據全部會丟失,另外也導出不了SQL。
以上就是我的觀點,對于這個問題大家是怎么看待的呢?歡迎在下方評論區交流 ~ 我是科技領域創作者,十年互聯網從業經驗,歡迎關注我了解更多科技知識!
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是一個基于分布式文件存儲的數據庫。由C++語言編寫。旨在為WEB應用提供可擴展的高性能數據存儲解決方案。
MongoDB是一個介于關系數據庫和非關系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數據庫的。它支持的數據結構非常松散,是類似JSON的BSON格式,因此可以存儲比較復雜的數據類型。Mongo最大的特點是它支持的查詢語言非常強大,其語法有點類似于面向對象的查詢語言,幾乎可以實現類似關系數據庫單表查詢的絕大部分功能,而且還支持對數據建立索引。
MongoDB基本概念
數據庫
一個MongoDB中可以建立多個數據庫。
MongoDB的默認數據庫為"db",該數據庫存儲在data目錄中。
MongoDB的單個實例可以容納多個獨立的數據庫,每一個都有自己的集合和權限,不同的數據庫也放置在不同的文件中。
文檔
文檔是一組鍵值(key-value)對(即BSON)。MongoDB 的文檔不需要設置相同的字段,并且相同的字段不需要相同的數據類型,這與關系型數據庫有很大的區別,也是 MongoDB 非常突出的特點。比如說{“username”}
需要注意的是:
文檔中的鍵/值對是有序的。
文檔中的值不僅可以是在雙引號里面的字符串,還可以是其他幾種數據類型(甚至可以是整個嵌入的文檔)。
MongoDB區分類型和大小寫。
MongoDB的文檔不能有重復的鍵。
文檔的鍵是字符串。除了少數例外情況,鍵可以使用任意UTF-8字符。
文檔鍵命名規范:
鍵不能含有