Elasticsearch
是一個分佈式的開源搜索和分析引擎, 適用於全部類型的數據,包括文本、數字、地理空間、結構化和啡結構化數據。Elasticsearch
在Apache Lucene
的基礎上開發而成,由Elasticsearch N.V.
(即如今的Elastic
)於2010年首次發佈。Elasticsearch
以其簡單的REST風格API、分佈式特性、速度和可擴展性而聞名,是Elastic Stack
的核心組件: Elastic Stac
k是適用於數據採集、充實、存儲、分析和可視化的一組開源工具。人們一般將Elastic Stack
稱爲ELK Stack
(代指Elasticsearch
、Logstash
和Kibana
),目前Elastic Stack
包括一系列豐富的輕星型數據採集代理, 這些代理統稱爲Beats
,可用來向Elasticsearch
發送數據。node
Elasticsearch
在速度和可擴展性方面表現出色,可以索引多種類型的內容,意味着能夠用於多種用例:docker
原始數據會從多個來源(包括日誌、系統指標和網絡應用程序)輸入到 Elasticsearch
中。數據採集指在Elasticsearch
中進行索引以前解析、標準化並充實這些原始數據的過程。這些數據在 Elasticsearch
中索引完成以後,用戶即可針對他們的數據運行復雜的查詢,並使用聚合來檢索自身數據的複雜彙總。在 Kibana
中,用戶能夠基於本身的數據建立強大的可視化,分享儀表板,並對 Elastic Stack
進行管理。shell
Elasticsearch
索引指相互關聯的文檔集合。Elasticsearch
會以 JSON
文檔的形式存儲數據。每一個文檔都會在一組鍵(字段或屬性的名稱)和它們對應的值(字符串、數字、布爾值、日期、數值組、地理位置或其餘類型的數據)之間創建聯繫。
Elasticsearch
使用的是一種名爲倒排索引的數據結構,這一結構的設計能夠容許十分快速地進行全文本搜索。倒排索引會列出在全部文檔中出現的每一個特有詞彙,而且能夠找到包含每一個詞彙的所有文檔。
在索引過程當中,Elasticsearch
會存儲文檔並構建倒排索引,這樣用戶即可以近實時地對文檔數據進行搜索。索引過程是在索引 API 中啓動的,經過此 API 您既可向特定索引中添加 JSON 文檔,也可更改特定索引中的 JSON 文檔。數據庫
動詞: 至關於 MySQL 中的 insert
名詞: 至關於 MySQL 中的 Databasejson
在 index (索引) 中,能夠定義一個或多個類型,相似於 MySQL 中的 Table ,每一種類型的數據放在一塊兒centos
把一條數據存在 ES 的某個索引的某個類型下,至關於 MySQL 的某個數據庫的某張表下api
保存在某個 索引(數據庫)下, 某種 類型(表) 的一個 Document 文檔(一條數據), 文檔是 JSON格式的,Document 就像是 MySQL 中的某個 Table 裏面的內容。安全
docker pull elasticsearch:7.4.2 docker pull kibana:7.4.2
先在本機中建立一個本身的目錄 , 如:/mydata/elasticsearch
, 而後再目錄底下建立三個文件夾 data
、 config
和plugins
,爲後面建立elasticsearch實例時,能夠作一個文件映射,便於咱們對 es 實例進行修改。
同時,在 config
文件夾裏,新建 elasticsearch.yml
配置文件,並配置 es 能夠被遠程的任何機器進行訪問服務器
mkdir -p /mydata/elasticsearch/data mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasticsearch/plugins echo "http.host:0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml
啓動 elasticsearch
實例網絡
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \ -e "discovery.type=single-node" \ -e ES_JAVA_OPTS="-Xms64m -Xmx256m" \ -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \ -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \ -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \ -d elasticsearch:7.4.2
-e "discovery.type=single-node"
: 設置 es 爲單節點運行
-e ES_JAVA_OPTS="-Xms64m -Xmx256m"
: 設置 es 的最小內存使用 64M ,最大內存使用爲 256 M
啓動成功後,訪問 http://主機IP:9200
,能看到以下信息,即爲建立成功
注: 若是啓動失敗,能夠經過命令 docker logs elasticsearch
查看啓動日誌,可能出現的錯誤:
一、沒有權限訪問。由於咱們啓動的命令掛載到了外面, 因此可能存在沒法訪問的寫入的權限
解決方案: 使用命令 chmod -R 777 /mydata/elasticsearch
給任何用戶任何組全部權限,重啓es實例便可。
kibana只須要建立實例,關聯咱們剛剛的es便可
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://主機IP:9200 \ -p 5601:5601 -d kibana:7.4.2
上面的命令是根據官方文檔查看而來的,不過這條命令在虛擬機中好像沒法啓動(我本地 [vmware 15.6 + centos7] 的環境下,一直沒法啓動成功,鏈接失敗),而在阿里雲ESC服務器上,能夠成功啓動,遇到上訴的狀況,能夠經過下面這條命令查看 es 實際暴露的 ip,把上面的主機 IP 修改成對應的 ip 便可
//007e爲elasticsearch的id docker inspect 007e 或者 docker inspect elasticsearch
則,kibana 建立的示例的命令爲
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://172.17.0.3:9200 \ -p 5601:5601 -d kibana:7.4.2
因爲咱們剛剛在執行前一個命令的時候,已經建立了一個名爲 kibana 的實例,因此須要先刪除後,在執行上一步的命令
// 查看全部運行中的實例 docker ps // 查看全部的實例 docker ps -a // 刪除 kibana 的實例 docker rm kibana
訪問 http://主機ip:5601
,看到以下頁面即爲建立成功
可以使用下面的兩個命令,使得咱們主機重啓後,實例也會自動啓動
docker update --restart=always elasticsearch docker update --restart=always kibana
GET http://主機ip:9200/_cat/nodes
GET http://主機ip:9200/_cat/health
GET http://主機ip:9200/_cat/master
GET
:http://主機ip:9200/_cat/indices
MySQL:保存一條數據到表中
保存一個數據,保存在哪一個索引的哪一個類型下, 能夠指定惟一標識
MySQL: 保存在哪一個數據庫的哪張表下
新增更新二合一,第一次發送爲新增,後面的則爲更新。不指定id會報錯,通常用作於修改
PUT
/customer/external/1
{ "name": "John Doe" }
新增修改二合一,不帶ID或者帶ID可是以前沒有數據爲新增,帶ID且以前有數據,爲修改
PUT
/customer/external/
{ "name": "John Doe" }
查詢 哪一個索引 下的 哪一個類型 下的 哪條數據
MySQL: 查詢哪一個數據庫下的哪張表的哪條數據
GET
/customer/external/1
_seq_no:併發控制字段,每次更新就會 +1 ,能夠用來作樂觀鎖
_primary_term:可用於作樂觀鎖,主分片從新分配,如重啓,就會變化
樂觀鎖使用:
更新前,先查詢出當前的數據,能夠獲取當前 _seq_no
以及當前 _primary_term
更新的時候,帶上?if_seq_no={當前 _seq_no }&if_primary_term={當前 _primary_term}
POST
/customer/external/1/_update
{ # doc 的內容爲文檔的最新值 "doc": { "name": "John Doew" } }
POST 帶 _update 更新, 會對比原數據,若是更新的數據與原來一致,則
_version
、_seq_no
不會變化, 且result
的值爲noop
,意思爲沒有作任何操做,且能夠給原有的文檔中,新增一個屬性{ # 帶 _update doc不可省略, doc 的內容爲文檔的最新值 "doc": { "name": "John Doew", "age": 20 } }如上的請求也是能夠成功的
POST
/customer/external/1
{ "name": "John Doew" }
PUT
/customer/external/1
{ "name": "John Doew" }
以上兩種方式的更新,永遠爲更新操做,不會對比原來的操做,每次請求 _version
、 _seq_no
都在不斷疊加,且同 帶 _updte
的 POST 請求同樣,能夠爲原有文檔新增上新的屬性
發送 DELETE
請求, 須要指定到具體的文檔、索引
DELETE
/customer/external/1
DELETE
/customer
在 ElasticSearch 中, 不提供刪除類型的方法
必須發送 POST
請求,在 PostMan 中沒法模擬請求,這裏須要用到 kibana
POST
/customer/external/_bulk
在 customer
索引下的 external
類型中批量執行
# 一個大括號表明一個操做,兩行爲一個動做 {"index":{"_id": "1"}} # 索引一個文檔,文檔的id爲1 {"name": "John Doe"} # 文檔的內容 {"index":{"_id": "2"}} {"name": "John Doe"}
took
:執行所花費的時間 errors
: 是否有錯誤
items
:獨立統計每條命令的執行結果,若是中間有某條命令執行失敗,後面的命令也不會受到影響,且命令執行失敗的時候,不會跟MySQL同樣,回滾