在學習elasticsearch之前,我們先要弄清楚幾個問題,就是what,why和how
1.what-------elasticsearch是什么
官方概念:elasticsearch是一個基於Lucene的搜索服務器。它提供了一個分布式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Java開發的,並作為Apache許可條款下的開放源碼發布,是當前流行的企業級搜索引擎。設計用於雲計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便
比較籠統,可以更加直觀地描述:
- 分布式的實時文件存儲,每個字段都被索引並可被搜索
- 分布式的實時分析搜索引擎
- 可以擴展到上百台服務器,處理PB級結構化或非結構化數據
其實只要知道這幾個關鍵字:分布式 實時 搜索引擎
2.why----------為什么用elasticsearch
在引入elasticsearch前,我們的數據一般都存儲在mysql上,所有的檢索都是直接在數據庫的查詢,當數據庫的數據量達到一定量時,數據庫的檢索效率就會很低,對此我們或許會有很多解決方案,比如對數據庫采用分庫分表(主從設置),數據庫分庫分表的確可以解決大部分數據量性能問題,但是同樣還是會有兩個問題無法避免:1分表多表的關聯查詢難度很大,不易實現(目前市場上主流的集中分庫分表插件都沒有很好的解決)2:沒有建立索引的字段查詢效率依舊不高 ; 也有人說可以采用Hbase,的確Hbase能夠支持的數據量確實大(一個表可以有數十億行,上百萬列),但是它的檢索是都是行級或者range,並不支持復雜的查詢,一般可以用於數據挖掘(統計報表類的比較合適); 於是基於以上場景,我們去分析elasticsearch的幾個特點:分布式(多shard的方式保證數據安全,也會提供自動resharding),一般不會因為數據量有性能問題,實時:elasticsearch的檢索速度非常快,接近實時(注意剛剛存儲的數據) 搜索引擎:相比Hbase,es的定位就是搜索索引,支持全文檢索;
3.how----------我們如何使用elasticsearch
es其實使用起來非常方便,上手很容易,具體教程我會在下一節給出
使用elasticsearch前,我們先得了解它的幾個概念:
Node 與 Cluster(節點與集群)
Elastic 本質上是一個分布式數據庫,允許多台服務器協同工作,每台服務器可以運行多個 Elastic 實例。
單個 Elastic 實例稱為一個節點(node)。一組節點構成一個集群(cluster)
Index(索引)
索引是一類文檔的集合 ES會索引所有字段,經過處理后寫入一個反向索引(Inverted Index)。查找數據的時候,直接查找該索引。
所以,Elastic 數據管理的頂層單位就叫做 Index(索引)。它是單個數據庫的同義詞。每個 Index 的名字必須是小寫(可以把把索引當成數據庫)。
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了
