ElasticSearch 是一個基於 Apache Lucene 的開源分佈式搜索引擎。它經過RESTful API 來隱藏Lucene的複雜性,從而讓全文搜索變得簡單。不過,Elasticsearch 不只僅是 Lucene 和全文搜索,咱們還能這樣去描述它:html
2004年, 有一個叫Shay Banon的待業工程師跟隨他的新婚妻子來到倫敦,他的妻子想在倫敦學習作一名廚師。而後他想爲本身的妻子開發一個方便搜索菜譜的應用,他開始使用 Lucene 的一個早期版本。可是嘗試以後,他感覺到了直接使用 Lucene 開發程序的各類暴擊和痛苦,因而他在 Lucene 之上,封裝了一個叫做 Compass 的程序框架而且把它開源了。node
後來 Shay 找到了一份跟高性能和分佈式相關的工做,他在工做中漸漸發現,愈來愈須要一個易用的高性能、實時、分佈式搜索服務,因而他決定重寫Compass,將它從一個庫打形成了一個獨立的server,並將其更名爲Elasticsearch。編程
Shay Banon在2010年2月發佈了Elasticsearch的第一個版本。它支持分佈式,能夠水平擴展,增長了Restful api, 下降了全文檢索的學習曲線,能夠被任何編程語言調用。json
2012年成立了Elasticsearch 公司,主要圍繞Elasticsearch及相關軟件提供商業服務和產品。2014年6月,在成立公司18個月後,該公司宣佈經過C輪融資籌集7000萬美圓。這輪融資由新企業協會(NEA)牽頭。其餘投資者包括Benchmark Capital和Index Ventures。這一輪融資總計1.04億美圓。api
2015年3月,Elasticsearch公司改名爲Elastic。安全
2018年6月,Elastic提交了首次公開募股申請,估值在15億到30億美圓之間。公司於2018年10月5日在紐約證券交易所掛牌上市。服務器
ElasticSearch 提供了開箱即用的功能,在 7.0 以前還須要安裝 Jdk,可是 7.0 以後內置了Jdk,因此只要從官網下載相應平臺的壓縮包便可。網絡
如下使用 Mac 做爲演示app
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.3.0-darwin-x86_64.tar.gz $ tar -zxvf elasticsearch-7.3.0-darwin-x86_64.tar.gz $ cd elasticsearch-7.3.0-darwin-x86_64
進入 elasticsearch 目錄中,而後運行elasticsearch 框架
$ ./bin/elasticsearch
若是啓動一切正常,ElasticSearch 默認會監聽 9200 端口,此時你能夠訪問本機的地址: http://localhost:9200, 會返回以下信息:
{ "name" : "chengshengzhangdeMacBook-Pro.local", "cluster_name" : "elasticsearch", "cluster_uuid" : "EsoM4PhOQzyPzGUOYH4E4A", "version" : { "number" : "7.3.0", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "de777fa", "build_date" : "2019-07-24T18:30:11.767338Z", "build_snapshot" : false, "lucene_version" : "8.1.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }
ElasticSearch 文件目錄以下:
集羣是一個或者多個節點協同工做來承載,並提供跨全部節點的索引和搜索功能。ElasticSearch 經過配置 cluster.name 來惟一標識集羣,或者在命令啓動時經過 -E cluster.name=my-cluster 指定。
節點是組成集羣的一個 ElasticSearch 實例,用於存儲數據並提供集羣的搜索和索引功能。與集羣同樣,ElasticSearch 經過配置 node.name 來惟一標識一個節點,或或者在命令啓動時經過 -E node.name=node1 指定。
本質上一個節點就是一個 Java 進程,一臺機器上能夠運行多個 ElasticSearch 進程,可是生產環境下通常建議一臺機器只運行一個 ElasticSearch 實例。
索引是相同特性的文檔集合。好比客戶索引,訂單索引。
ElasticSearch 在 7.0 以前,一個Index能夠設置多個Type,可是從 6.0 開始,Type已經被 Deprecated,7.0 開始,一個索引只能建立一個 Type, 名字叫 "_doc"。
ElasticSearch 是面向文檔的,文檔是全部可搜索數據的最小單位,好比一條日誌信息,一筆訂單數據等。文檔會被序列化成 JSON 格式,保存在 ElasticSearch 中,每一個文檔都會有一個UniqueID,能夠在建立的時候本身指定,也能夠經過 ElasticSearch 自動生成。
ElasticSearch 是分佈式的,爲了解決索引能夠存儲超過一個節點機器硬件限制的數據的問題。ES 提供了將單個索引分割成多個分片的功能。ES 的分片分爲 Primary Shard(主分片) and Replicas Shard(副本) 。
主分片,用戶解決數據水平擴展的問題,經過主分片,能夠將數據分佈到集羣內的全部節點上。一個分片本質上是一個運行的 Lucene 實例,主分片在索引建立時指定,後續不容許修改,除非進行 Reindex。
副本,用以解決數據高可用的問題,副本是主分片的拷貝。副本分片數,能夠進行動態調整,增長副本數,能夠在必定程度上提供服務的可用性(讀取的吞吐)。
若是您正在使用.zip或.tar.gz文件歸檔,data和logs 目錄在 $ES_HOME 下。若是這些重要文件夾保留在默認位置,則Elasticsearch升級到新版本時,頗有可能被刪除。在生產中使用,確定要更改數據和日誌文件夾的位置:
path: logs: /var/log/elasticsearch data: /var/data/elasticsearch
補充說明:在生產環境下,應用程序的數據和日誌通常須要配置到獨立的磁盤分區下。好比/data目錄做爲獨立的數據分區,/var/log做爲應用程序日誌分區。這樣作的好處是,防止因應用程序數據或日誌增加,撐爆OS分區。
集羣名稱,惟一標識一個集羣,某個節點只有和集羣下的其餘節點共享它的 cluster.name 才能加入一個集羣。默認是elasticsearch,可是應該修改成更恰當的,用於描述集羣目的的名稱。
cluster.name: my-cluster
必定要確保不要在不一樣的環境中使用相同的集羣名稱。不然,節點可能會加入錯誤的集羣中。
節點名稱, 惟一標識一個節點,默認狀況下,Elasticsearch 將使用隨機生成的uuid的前7個字符做爲節點id,請注意,節點ID是持久化的,而且在節點從新啓動時不會更改,所以默認節點名稱也不會更改。也可使用服務器的 HOSTNAME 做爲節點的名稱。
node.name: ${HOSTNAME}
node.master 表示節點是否參與master的選舉,默認爲 true。每個節點上都保存了集羣的狀態,只有 Master 節點才能修改集羣的狀態信息。
node.data 表示節點是不是數據節點,默認是 true。負責保存分片數據。
默認狀況下,ElasticSearch 僅僅綁定迴環地址,好比 127.0.0.1 和 [::1], 這足以在服務器上運行單個開發節點。爲了與其餘服務器上的節點進行通訊並造成集羣,你的節點將須要綁定到非環回地址。雖然這裏有不少網絡相關的配置,但一般只須要配置一下 network.host。
network.host: 192.168.60.101
一旦自定義設置了 network.host ,Elasticsearch 會假定你正在從開發模式轉移到生產模式,並將許多系統啓動檢查從警告升級到異常。
默認狀況下,Elasticsearch假定您正在開發模式下工做。 若是未正確配置上述任何設置,則會向日志文件寫入警告,但您將可以啓動並運行Elasticsearch節點。
一旦配置了network.host之類的網絡設置,Elasticsearch就會假定您正在轉向生產並將上述警告升級爲異常。 這些異常將阻止您的Elasticsearch節點啓動。 這是一項重要的安全措施,可確保您不會因服務器配置錯誤而丟失數據。
Type 名稱約定是 _doc, 若是向指定的 /Index/doc 發送 PUT 請求,就能夠在該 Index 下面增長一條記錄,若是文檔ID不存在,則建立新的文檔。不然會先刪除現有的文檔,再建立新的文檔,可是版本號會增長。
curl -X PUT http://localhost:9200/my_index/_doc/1 -H 'Content-Type:application/json' -d ' { "user": "zhang san", "title": "Development Engineer" }'
返回值:
{ "_index":"my_index", "_type":"_doc", "_id":"1", "_version":1, "result":"created", "_shards":{ "total":2, "successful":1, "failed":0 }, "_seq_no":0, "_primary_term":1 }
經過 _create 建立新的文檔,若是文檔ID存在,則會建立失敗,以下:
curl -X PUT http://localhost:9200/my_index/_create/1 -H 'Content-Type:application/json' -d ' { "user": "li si", "title": "Development Engineer" }'
返回值:
{ "error":{ "root_cause":[ { "type":"version_conflict_engine_exception", "reason":"[1]: version conflict, document already exists (current version [2])", "index_uuid":"2ow9LqwSQout7C_y9dW-wA", "shard":"0", "index":"my_index" } ], "type":"version_conflict_engine_exception", "reason":"[1]: version conflict, document already exists (current version [2])", "index_uuid":"2ow9LqwSQout7C_y9dW-wA", "shard":"0", "index":"my_index" }, "status":409 }
經過 GET 方式能夠讀取相應的文檔。 找到文檔,返回 HTTP 200, 找不到文檔,返回 HTTP 404。
curl -X GET http://localhost:9200/my_index/_doc/1
返回值:
{ "_index":"my_index", "_type":"_doc", "_id":"1", "_version":2, "_seq_no":1, "_primary_term":1, "found":true, "_source":{ "user":"zhang san", "title":"Development Engineer" } }
Update 方法不會刪除原來的文檔,而是實現真正的數據更新。 採用POST請求方式,Payload 須要包含在 "doc" 上。
curl -X POST http://localhost:9200/my_index/_update/1 -H 'Content-Type:application/json' -d ' { "doc": {"user": "lisi"} }'
返回值:
{ "_index":"my_index", "_type":"_doc", "_id":"1", "_version":6, "result":"updated", "_shards":{ "total":2, "successful":1, "failed":0 }, "_seq_no":6, "_primary_term":1 }
Delete 刪除文檔
curl -X DELETE http://localhost:9200/my_index/_doc/1
返回值:
{ "_index":"my_index", "_type":"_doc", "_id":"1", "_version":3, "result":"deleted", "_shards":{ "total":2, "successful":1, "failed":0 }, "_seq_no":3, "_primary_term":1 }