一、elasticsearch是什么
elasticsearch是一個基于Lucene的搜索服務器,采用Java語言撰寫,使用Lucene構建索引、提供搜索功能,并作為Apache許可條款下的開發原始碼發布,是當前流行的企業級搜索引擎,其實Lucene的功能已經很強大了,為什么還要多此一舉的開發elasticsearch呢?原因是因為Lucene只是一個由Java語言撰寫的庫,對不適用Java語言的開發人員并不友好,所以elasticsearch在Lucene上做了很多改進,提供了多種語言的介面,Lucene之于elasticsearch堪比發動機之于汽車,elasticsearch底層使用的仍然是Lucene的api,Lucene專注于底層搜索的建設,elasticsearch專注于企業應用,elasticsearch的目標是讓全文搜索變得簡單,開發者可以通過簡單明了的restful api輕松實作搜索功能,而不必去面對Lucene的復雜性,
二、elasticsearch架構

Gateway是elasticsearch用來存盤索引的檔案系統,支持多種檔案型別,Local FileSystem是本地的檔案系統,Shared FileSystem是共享存盤,也可以使用Hadoop的HDFS分布式存盤,也可以存盤在Amazon的s3服務器上,
Gateway上層是一個分布式的Lucene框架,elasticsearch的底層Api是由Lucene提供的,每一個elasticsearch節點上都有一個Lucene節點的支持,
Lucene之上是elasticsearch的模塊,包括索引模塊、搜索模塊、映射決議模塊等,river相當于第三方插件,用于匯入第三方資料源,在2.x之后已經不再使用,
elasticsearch模塊之上是Discovery和Scripting和第三方插件,Discovery是elasticsearch的節點發現模塊,不同機器上的elasticsearch節點要組成集群需要進行訊息通信,集群內部需要選舉master節點,這些作業都是Discovery模塊完成的,Scripting用來支持Python、JavaScript等多種語言的,可以在查詢陳述句中嵌入,使用script陳述句性能稍低,elasticsearch也支持多種第三方插件,
再上層是elasticsearch的傳輸模塊和JMX,傳輸模塊支持Thrift、Memcached、Http,默認使用HTTP傳輸,JMX是Java的管理框架,用來管理elasticsearch應用
最上層是elasticsearch提供給用戶的介面,可以通過restful api和elasticsearch集群進行互動,
三、elasticsearch優點
- 分布式:Elasticsearch橫向擴展非常方便靈活,當規模較小時可以使用小規模的集群,隨著資料的增長,需要更大的容量和更高的性能,此時只需增加更多的節點,Elasticsearch的自動發現機制會識別新增的節點并重新平衡分配資料,
- 全文檢索:Apache Lucene是一個用Java撰寫的高性能的功能齊全的資訊檢索庫,Elasticsearch在底層使用Lucene來提供強大的全文檢索,提供任何開源產品的能力,自帶多語言支持、強大的查詢語言、地理位置支持,背景關系感知的建議、自動完成和搜索片段,
- 近實時搜索和分析:資料進入Elasticsearch后,可達到實時搜索,Elasticsearch還支持聚合分析操作
- 高可用:高可用主要體現在容錯方面,Elasticsearch集群會自動發現新的或失敗的節點,重組和重新平衡資料,確保資料是安全和可訪問的,
- 模式自由:Elasticsearch的動態mapping機制可以自動的檢測資料的結構和型別,創建索引,并使資料可搜索,
- Restful Api:Elasticsearch是Api驅動,幾乎任何操作都可以用一個簡單的Restful Api使用JSON基于HTTP請求實作,客戶端也可使用多種編程語言,
- 應用場景豐富:站內搜索、nosql資料庫(Elasticsearch在讀寫性能上由于MongoDB,同時也支持地理位置查詢)、日志分析(日志分析平臺ELK,能夠對日志進行集中的收集、存盤、搜索、分析、監控以及可視化)等,
四、Elasticsearch核心概念[1]
來源:https://www.jianshu.com/p/cec1b8b3698d
集群(cluster)
代表一個集群,集群中有多個節點node,其中一個為主節點,這個主節點可以通過選舉產生的,主節點是對于集群內部來說的,ES的一個概念就是去中心化,字面上理解就是無中心化節點,這是對于集群外部來說的,因為從外部來看ES集群,在邏輯上是一個整體,你與任何一個節點的通信和整個ES集群通信是等價的
一個集群就是由一個或者多個節點組織在一起,它們共同持有整個的資料,并在一起提供索引和搜索功能,一個集群由一個唯一的名字標識,一個節點只能通過指定某個集群的名字,來加入這個集群,
節點(node)
一個節點是集群中的一個服務器,作為集群的一部分,存盤資料,參與集群的索引和搜索功能,一個節點也是由一個名字來標識的,默認情況下,這個名字是一個隨機的漫威漫畫角色的名字,這個名字會在啟動的時候賦予節點,這個名字對于管理作業來說挺重要的,因為在這個管理程序中,要確定網路中的哪些服務器對應于Elasticsearch集群中的哪些節點,
索引(index)
ES將它的資料存盤在一個或多個索引(index)中,類似sql中的資料庫,可以向索引中寫入檔案或者讀取檔案,并通過ES內部使用Lucene將資料索引或從索引中檢索資料
一個索引就是一個擁有幾分相似特征的檔案的集合(類似于我們在資料庫中的庫結構),一個索引由一個名字來標識,并且在我們要對對這個索引中的檔案進行索引,搜索,更新和洗掉的時候,都要使用到這個名字,
檔案(document)
檔案是ES中主要的物體,對所有使用ES的案例來說,他們最終都可以終結為對檔案的搜索,檔案由欄位構成,
映射(mapping)
所有檔案寫進索引之前都會先進行分析,如果將輸入的文本分割為詞條,哪些詞條又會被過濾,這種行為叫做映射(mapping),一般由用戶自己定義規則
型別(type)
每個檔案都有與之對應的型別定義,這允許用戶在一個索引中存盤多種檔案型別,并為不同檔案型別提供不同的映射
分片(shards)
shards代表索引分片,ES可以把一個完整的索引分成多個分片,這樣的好處是可以把一個大的索引拆分成多個,分布到不同的節點上,構成分布式搜索,分片的數量只能在索引創建前指定,并且索引創建后不能更改,
分片有兩個好處,一是可以水平擴展,另一個是可以并發提高性能,
副本(replicas)
代表索引副本,ES可以設定多個索引副本,副本的作用一是提高系統的容錯性,實作高可用(HA),當某個節點某個分片損壞或丟失時可以從副本中恢復;二是提高ES的查詢效率,ES會自動對搜索請求進行負載均衡,
五、對比RDBMS
Elasticsearch可以看成是一個資料庫,只是和關系型資料庫比起來資料格式和功能不一樣而已
六、索引管理
創建索引和mysql中創建一個資料庫是一樣的,注意Elasticsearch索引名稱中不能出現大寫字母
新建一個索引,名為blog
PUT blog
回應結果:
{ "acknowledged": true, "shards_acknowledged": true, "index": "blog"}
回傳結果顯示acknowledged的值為true,說明新建索引成功,如果索引名含有大寫字母,會報一個非法的索引名例外
PUT ABC
回應結果:
{ "error": { "root_cause": [ { "type": "invalid_index_name_exception", "reason": "Invalid index name [ABC], must be lowercase", "index_uuid": "_na_", "index": "ABC" } ], "type": "invalid_index_name_exception", "reason": "Invalid index name [ABC], must be lowercase", "index_uuid": "_na_", "index": "ABC" }, "status": 400}
如果新添加的索引在Elasticsearch服務器中已存在,新建同名索引已存在
PUT blog
{ "error": { "root_cause": [ { "type": "resource_already_exists_exception", "reason": "index [blog/X95-a-PIRDK0EONkuAeKcg] already exists", "index_uuid": "X95-a-PIRDK0EONkuAeKcg", "index": "blog" } ], "type": "resource_already_exists_exception", "reason": "index [blog/X95-a-PIRDK0EONkuAeKcg] already exists", "index_uuid": "X95-a-PIRDK0EONkuAeKcg", "index": "blog" }, "status": 400}
Elasticsearch默認給一個索引設定5個分片1個副本,一個索引的分片數一經指定后就不能再修改,副本數可以通過命令隨時更改,如果想創建自定義分片數和副本數的索引,可以通過setting引數在索引時設定初始化資訊,以創建3個分片0個副本為例:
PUT blog
{ "settings": { "number_of_shards": 3, "number_of_replicas": 0 }}
更新副本數
PUT blog/_settings
{ "number_of_replicas": 2}
查看索引
使用GET方法加上_settings引數可以查看一個索引的所有配置資訊,例如查看blog索引的所有設定資訊
GET blog/_settings
{ "blog": { "settings": { "index": { "creation_date": "1575511488734", "number_of_shards": "5", "number_of_replicas": "1", "uuid": "X95-a-PIRDK0EONkuAeKcg", "version": { "created": "6070199" }, "provided_name": "blog" } } }}
同時查看多個索引的settings資訊
GET blog,doc/_settings
查看集群中所有索引的settings資訊
GET _all/_settings
索引的洗掉只需要使用delete方法,傳入要洗掉的索引名即可,執行索引洗掉命令前需要慎重考慮,因為一旦執行洗掉操作,索引中的檔案就不復存在,注意在洗掉資料之前做好備份操作
洗掉名為blog的索引
DELETE blog
回應結果:
{"acknowledged": true}
如果洗掉的索引不存在,會報索引未找到例外
DELETE blog
{"error": { "root_cause": [ { "type": "index_not_found_exception", "reason": "no such index", "resource.type": "index_or_alias", "resource.id": "blog", "index_uuid": "_na_", "index": "blog" } ], "type": "index_not_found_exception", "reason": "no such index", "resource.type": "index_or_alias", "resource.id": "blog", "index_uuid": "_na_", "index": "blog" }, "status": 404}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/44418.html
標籤:大數據
