ES(ElasticSearch)學習總結


基本概念

一個分布式多用戶能力的全文搜索引擎,基於RESTful web接口。

Elasticsearch和MongoDB/Redis/Memcache一樣,是非關系型數據庫。是一個接近實時的搜索平台,從索引這個文檔到這個文檔能夠被搜索到只有一個輕微的延遲,企業應用定位:采用Restful API標准的可擴展和高可用的實時數據分析的全文搜索工具。底層基於Lucene,采用多shard的方式保證數據安全,並且提供自動resharding的功能,github等大型的站點也采用Elasticsearch作為其搜索服務。

ES是java開發的,需要安裝java運行環境jdk或者jre。

ES與MySQL各概念對應關系:

ES

MySQL

索引

數據庫

類型

文檔

記錄

索引(Index)

   ES將數據存儲於一個或多個索引中,索引是具有類似特性的文檔的集合。類比傳統的關系型數據庫領域來說,索引相當於SQL中的一個數據庫,或者一個數據存儲方案(schema)。索引由其名稱(必須為全小寫字符)進行標識,並通過引用此名稱完成文檔的創建、搜索、更新及刪除操作。一個ES集群中可以按需創建任意數目的索引。

類型(Type)

   類型是索引內部的邏輯分區(category/partition),然而其意義完全取決於用戶需求。因此,一個索引內部可定義一個或多個類型(type)。一般來說,類型就是為那些擁有相同的域的文檔做的預定義。例如,在索引中,可以定義一個用於存儲用戶數據的類型,一個存儲日志數據的類型,以及一個存儲評論數據的類型。類比傳統的關系型數據庫領域來說,類型相當於“表”。

文檔(Document)

   文檔是Lucene索引和搜索的原子單位,它是包含了一個或多個域的容器,基於JSON格式進行表示。文檔由一個或多個域(Field)組成,每個域擁有一個名字及一個或多個值,有多個值的域通常稱為“多值域”。每個文檔可以存儲不同的域集,但同一類型下的文檔至應該有某種程度上的相似之處。

域(field)

    文檔由多個域組成,不同的文檔里面同名的域一定具有相同的數據類型。文檔里面域可以重復出現,也就是一個field會有多個值,即multivalued。

映射(Mapping)

存儲域field的相關映射信息,不同type會有不同的mapping。

ES中,所有的文檔在存儲之前都要首先進行分析。用戶可根據需要定義如何將文本分割成語匯單元(token)、哪些token應該被過濾掉,以及哪些文本需要進行額外處理等等。另外,ES還提供了額外功能,例如將域中的內容按需排序。事實上,ES也能自動根據其值確定域的類型。

大致可以認為Index就是一個db,document type就是一個table,document就是一行數據,field就是table的column,mapping就是table的定義。

整體架構

在服務層面,主要有:

Node: 一個server實例。

Cluster:多個node組成cluster。

Shard:數據分片,一個index可能會存在於多個shards,不同shards可能在不同nodes。

Shard有兩種類型:primary和replica,即主shard及副本shard。Primary shard用於文檔存儲,每個新的索引會自動創建5個Primary shard,當然此數量可在索引創建之前通過配置自行定義,不過,一旦創建完成,其Primary shard的數量將不可更改。Replica shard是Primary Shard的副本,用於冗余數據及提高搜索性能。每個Primary shard默認配置了一個Replica shard,但也可以配置多個,且其數量可動態更改。ES會根據需要自動增加或減少這些Replica shard的數量。

Replica:shard的備份,有一個primary shard,其余的叫做replica shards。

ES可自動在節點間按需要移動shard,例如增加節點或節點故障時。簡而言之,分片實現了集群的分布式存儲,而副本實現了其分布式處理及冗余功能。

Elasticsearch之所以能動態resharding,主要在於它最開始就預先分配了多個shards(貌似是1024),然后以shard為單位進行數據遷移。這個做法其實在分布式領域非常的普遍,codis就是使用了1024個slot來進行數據遷移。

因為任意一個index都可配置多個replica,通過冗余備份的方式保證了數據的安全性,同時replica也能分擔讀壓力,類似於MySQL中的slave。

訪問方式

Elasticsearch提供了Restful API,使用json格式,這使得它非常利於與外部交互,雖然Elasticsearch的客戶端很多,但筆者仍然很容易的就寫出了一個簡易客戶端用於項目中,再次印證了Elasticsearch的使用真心很容易。

ElasticSearch的RESTful API通過tcp協議的9200端口提供,可通過任何趁手的客戶端工具與此接口進行交互,這其中包括最為流行的curl。

Restful的接口很簡單,一個url表示一個特定的資源,譬如/blog/article/1,就表示一個index為blog,type為aritcle,id為1的document。

而我們使用http標准method來操作這些資源,POST新增,PUT更新,GET獲取,DELETE刪除,HEAD判斷是否存在。

倒排索引

在全文搜索里,文檔數據離不開搜索,而搜索離不開索引(沒有索引搜索會很低效),倒排索引(Inverted index)是全文搜索系統里最高效的索引方法和數據結構,ES的索引就是倒排索引。也稱反向索引/置入索引或反向檔案,用以存儲一個映射:在全文搜索下某個單詞在一個文檔或者一組文檔中的位置。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM