在MacOS安裝ElasticSearch-7.2.0 版本,步驟很是簡單,簡單幾行命令就能夠搞定。下面是安裝步驟sql
# 下載ElasticSearch程序 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.2.0-darwin-x86_64.tar.gz # sha512祕鑰文件 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.2.0-darwin-x86_64.tar.gz.sha512 # 文件比對 shasum -a 512 -c elasticsearch-7.2.0-darwin-x86_64.tar.gz.sha512 # 解壓 tar -xzf elasticsearch-7.2.0-darwin-x86_64.tar.gz
完成第1步以後,咱們能夠直接在終端
運行下面的命令,來啓動ES服務。shell
cd elasticsearch-7.2.0/ ./bin/elasticsearch
執行啓動命令後,若是終端上打印了相似以下的信息,說明ES服務啓動成功了。數據庫
[2019-07-21T14:29:48,576][INFO ][o.e.p.PluginsService ] [maxiangchengdeMacBook-Pro.local] loaded module [aggs-matrix-stats] [2019-07-21T14:29:48,577][INFO ][o.e.p.PluginsService ] [maxiangchengdeMacBook-Pro.local] loaded module [analysis-common] [2019-07-21T14:29:48,577][INFO ][o.e.p.PluginsService ] [maxiangchengdeMacBook-Pro.local] loaded module [ingest-common] [2019-07-21T14:29:48,577][INFO ][o.e.p.PluginsService ] [maxiangchengdeMacBook-Pro.local] loaded module [ingest-geoip] [2019-07-21T14:29:48,577][INFO ][o.e.p.PluginsService ] [maxiangchengdeMacBook-Pro.local] loaded module [ingest-user-agent]
在本地啓動ElasticSearch服務後,ES默認監聽9200端口,咱們的查詢,修改和添加等操做都會在該端口完成。客戶端和ES的交互使用http協議,接口設計使用restful風格,使用起來很是簡潔友好。換句話說,咱們能夠直接使用POSTMAN
和ES進行交互,經過發送PUT
,GET
,DELETE
等請求,來完成數據的CRUD操做。http協議對編程語言也很是友好,由於幾乎全部編程語言都支持http協議,大大下降了使用門檻,這些也是ES很是流行的緣由。編程
ES中有幾個概念須要提早了解,ES不一樣於傳統數據庫,它的數據存儲的單位和關係型數據庫會略有差異,有些可能只是叫法不同,我認爲本質仍是同樣的。以你們常用的MySQL爲例,咱們對數據存儲單元會有下面這幾個等級的劃分,從大到小排列,分別爲database
,table
,row
,column
。分別表示 數據庫
,表
,行
,列
。一樣的,在ES中也有數據單元的劃分,下圖表示ES中數據存儲單元和MySQL數據存儲單元的對應關係。json
在最新版本的ES中,只有索引,文檔和字段的概念,索引至關於Mysql中的數據庫,文檔表明數據行,字段表示列,沒有了表的概念,其它都是同樣的。restful
理解了上面的概念,如今咱們來新建一個索引,因爲ES的交互基於http協議,索引咱們只須要使用POSTMAN
向本地的ES服務發起http請求便可新建索引,請求類型爲PUT請求,在請求地址中帶上須要新建的索引名稱。例如:下面的請求會新建一個customer
索引。
PUT http://localhost:9200/customer
請求完成後若獲得以下響應,表示索引創建成功elasticsearch
{ "acknowledged": true, "shards_acknowledged": true, "index": "customer" }
ES中索引名不能重複,若重複創建索引,會獲得以下響應,表示索引已存在編程語言
{ "error": { "root_cause": [ { "type": "resource_already_exists_exception", "reason": "index [customer/lpNY_ivHTBedu8Nj14jdBQ] already exists", "index_uuid": "lpNY_ivHTBedu8Nj14jdBQ", "index": "customer" } ], "type": "resource_already_exists_exception", "reason": "index [customer/lpNY_ivHTBedu8Nj14jdBQ] already exists", "index_uuid": "lpNY_ivHTBedu8Nj14jdBQ", "index": "customer" }, "status": 400 }
創建好索引,下一步咱們在索引中添加數據,即文檔(Document)
。客戶端和ES的交互採用JSON格式和HTTP協議。例如:下面的請求將在customer
的索引中建立一個id爲1的文檔,文檔中包含了username
,age
,phone
等字段。另外,在_doc後面指定了文檔的id,文檔id在每一個索引中都是惟一的,相似數據庫中的主鍵id。ui
PUT /customer/_doc/1 { "username" : "jack", "age" : 18, "phone" : "18880000000" }
添加成功後,獲得以下響應spa
{ "_index": "customer", "_type": "_doc", "_id": "1", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 0, "_primary_term": 1 }
響應中包含了不少字段,如今咱們只須要關注successful字段便可,1表示成功。
咱們也能夠對文檔進行修改,指定文檔id,提交須要修改的JSON數據,就能夠對指定id的文檔進行修改。例如:下面的請求將修改文檔id爲1的文檔。
PUT /customer/_doc/1 { "username" : "meetmax", "age" : 15, "phone" : "18880000000" }
修改爲功後,獲得以下響應
{ "_index": "customer", "_type": "_doc", "_id": "1", "_version": 3, "result": "updated", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 2, "_primary_term": 1 }
針對一些不須要的文檔,也能夠執行刪除操做,只須要指定索引名和文檔id,而後調用DELETE
方法便可。
DELETE /customer/_doc/1
刪除成功後,獲得以下響應
{ "_index": "customer", "_type": "_doc", "_id": "1", "_version": 4, "result": "deleted", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 3, "_primary_term": 1 }
有了索引和文檔數據,咱們須要對已有數據進行查詢。不一樣於SQL語句,ES也有本身的查詢語言,稱爲 Query DSL
。簡單來說,它是以JSON爲載體構造出查詢條件,只是換了個表述方式,和SQL語句的本質是同樣的,能實現的查詢功能也差很少,ES甚至支持SQL語法,只是須要安裝擴展便可實現。例如:下面的請求,將查詢在customer
索引中,username
字段值爲jack的文檔。
GET /customer/_search { "query" : { "match" : { "username" : "jack" } } }
查詢成功後,將獲得以下響應,其中hits字段包含了匹配到的數據
{ "took": 2, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 1, "relation": "eq" }, "max_score": 0.9808292, "hits": [ { "_index": "customer", "_type": "_doc", "_id": "1", "_score": 0.9808292, "_source": { "username": "jack", "age": 18, "phone": "18880000000" } } ] } }
整體來講,ES仍是很是容易上手的,固然也僅僅侷限於上手,文中用到的只是ES功能中的冰山一角,真正的實踐中,有更多複雜的用法,能夠實現很是強大的功能。例如:對數據進行聚合查詢和分頁,多條件過濾查詢,甚至對地理位置進行查詢。另外,咱們可能對ES中的核心概念還有些模糊,對ES的底層實現機制也不瞭解,可是如今不理解不要緊,有了實踐經驗以後,之後理解起來會很快,掌握的更深入。後面我也會對ES的核心概念和實現原理總結和分析,但願對你有用!