色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

mysql 合并兩個查詢,elasticsearchlucene可以代替NoSQLmongodb嗎

劉柏宏2年前21瀏覽0評論
mysql 合并兩個查詢,elasticsearchlucene可以代替NoSQLmongodb嗎?

一.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的適用場景

維基百科,類似百度百科,牙膏,牙膏的維基百科,全文檢索,高亮,搜索推薦

The Guardian(國外新聞網站),類似搜狐新聞,用戶行為日志(點擊,瀏覽,收藏,評論)+社交網絡數據(對某某新聞的相關看法),數據分析,給到每篇新聞文章的作者,讓他知道他的文章的公眾反饋(好,壞,熱門,垃圾,鄙視,崇拜)

Stack Overflow(國外的程序異常討論論壇),IT問題,程序的報錯,提交上去,有人會跟你討論和回答,全文檢索,搜索相關問題和答案,程序報錯了,就會將報錯信息粘貼到里面去,搜索有沒有對應的答案

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實時理論上無數據丟失風險。