天天看點

ElasticSearch概述和定義

elasticsearch是什麼

Elasticsearch 是一個分布式可擴充的實時搜尋和分析引擎,一個建立在全文搜尋引擎 Apache Lucene(TM) 基礎上的搜尋引擎.基于RESTful web接口。Elasticsearch是用Java開發的,并作為Apache許可條款下的開放源碼釋出,是目前流行的企業級搜尋引擎。設計用于雲計算中,能夠達到實時搜尋,穩定,可靠,快速,安裝使用友善。Luncene是單節點的API,ElasticSearch是分布式的。當然 Elasticsearch 并不僅僅是 Lucene 那麼簡單,它不僅包括了全文搜尋功能,還可以進行以下工作:

  • 分布式實時檔案存儲,并将每一個字段都編入索引,使其可以被搜尋。
  • 實時分析的分布式搜尋引擎。
  • 可以擴充到上百台伺服器,處理PB級别的結構化或非結構化資料。

其實隻要知道這幾個關鍵字:分布式 實時 搜尋引擎

為什麼用elasticsearch

  在引入elasticsearch前,我們的資料一般都存儲在mysql上,所有的檢索都是直接在資料庫的查詢,當資料庫的資料量達到一定量時,資料庫的檢索效率就會很低,對此我們或許會有很多解決方案,比如對資料庫采用分庫分表(主從設定),資料庫分庫分表的确可以解決大部分資料量性能問題,但是同樣還是會有兩個問題無法避免:1分表多表的關聯查詢難度很大,不易實作(目前市場上主流的集中分庫分表插件都沒有很好的解決)2:沒有建立索引的字段查詢效率依舊不高  ;也有人說可以采用Hbase,的确Hbase能夠支援的資料量确實大(一個表可以有數十億行,上百萬列),但是它的檢索是都是行級或者range,并不支援複雜的查詢,一般可以用于資料挖掘(統計報表類的比較合适);  于是基于以上場景,我們去分析elasticsearch的幾個特點:分布式(多shard的方式保證資料安全,也會提供自動resharding),一般不會因為資料量有性能問題,實時:elasticsearch的檢索速度非常快,接近實時(注意剛剛存儲的資料)  搜尋引擎:相比Hbase,es的定位就是搜尋索引,支援全文檢索; 

總的來說ElasticSearch 産生背景是海量資料組合條件查詢,毫秒級或者秒級傳回資料

如何使用elasticsearch

es其實使用起來非常友善,上手很容易,我們先得了解它的幾個概念:

Node 與 Cluster(節點與叢集)。Elastic 本質上是一個分布式資料庫,允許多台伺服器協同工作,每台伺服器可以運作多個 Elastic 執行個體。單個 Elastic 執行個體稱為一個節點(node)。一組節點構成一個叢集(cluster)

Index(索引)

索引是一類文檔的集合 ES會索引所有字段,經過處理後寫入一個反向索引(Inverted Index)。查找資料的時候,直接查找該索引。

是以,Elastic 資料管理的頂層機關就叫做 Index(索引)。它是單個資料庫的同義詞。每個 Index 的名字必須是小寫(可以把把索引當成資料庫)。

Elasticsearch索引的精髓:一切設計都是為了提高搜尋的性能

type(類型)

類型可以了解成一個索引的邏輯分區,用于辨別不同的文檔字段資訊的集合。但是由于ES還是以索引為粗粒度的機關,是以一個索引下的所有的類型,都存放在一個索引下。這也就導緻不同類型相同字段名字的字段會存在類型定義沖突的問題。

在2.0之前的版本,是可以插入但是不能搜尋;在2.0之後的版本直接做了插入檢查,禁止字段類型沖突(據說es在6.x之後會取消type)。

document(文檔)

文檔是存儲資料資訊的基本單元,使用json來表示。

shard與replica (分片與備份)

在ES中,索引會備份成分片,每個分片是獨立的lucene索引,可以完成搜尋分析存儲等工作。

分片的好處:

1 如果一個索引資料量很大,會造成硬體硬碟和搜尋速度的瓶頸。如果分成多個分片,分片可以分攤壓力。

2 分片允許使用者進行水準的擴充和拆分

3 分片允許分布式的操作,可以提高搜尋以及其他操作的效率

備份的好處:

1、當一個分片失敗或者下線時,備份的分片可以代替工作,提高了高可用性。

2、備份的分片也可以執行搜尋操作,分攤了搜尋的壓力。

ES預設在建立索引時會建立5個分片,這個數量可以修改。

基本概念

先說Elasticsearch的檔案存儲,Elasticsearch是面向文檔型資料庫,一條資料在這裡就是一個文檔,用JSON作為文檔序列化的格式,比如下面這條使用者資料:

{              "name" :     "John",              "sex" :      "Male",              "age" :      25,              "birthDate": "1990/05/01",              "about" :    "I love to go rock climbing",              "interests": [ "sports", "music" ]              }           

用Mysql這樣的資料庫存儲就會容易想到建立一張User表,有balabala的字段等,在Elasticsearch裡這就是一個文檔,當然這個文檔會屬于一個User的類型,各種各樣的類型存在于一個索引當中。這裡有一份簡易的将Elasticsearch和關系型資料術語對照表:

關系資料庫⇒ 資料庫⇒表⇒ 行⇒ 列(Columns)      

Elasticsearch⇒索引(Index)⇒類型(type)⇒文檔(Docments)⇒ 字段(Fields)

一個 Elasticsearch 叢集可以包含多個索引(資料庫),也就是說其中包含了很多類型(表)。這些類型中包含了很多的文檔(行),然後每個文檔中又包含了很多的字段(列)。Elasticsearch的互動,可以使用Java API,也可以直接使用HTTP的Restful API方式,比如我們打算插入一條記錄,可以簡單發送一個HTTP的請求:

PUT /megacorp/employee/1                {              "name" :     "John",              "sex" :      "Male",              "age" :      25,              "about" :    "I love to go rock climbing",              "interests": [ "sports", "music" ]              }           

Elasticsearch 和Solr 的差別 :

繼續閱讀