ElasticSearch 介紹、Docker安裝以及基本檢索

1、簡介

1.1 什麼是Elasticsearch?

Elasticsearch是一個分佈式的開源搜索和分析引擎, 適用於全部類型的數據,包括文本、數字、地理空間、結構化和啡結構化數據。ElasticsearchApache Lucene的基礎上開發而成,由Elasticsearch N.V. (即如今的Elastic)於2010年首次發佈。Elasticsearch 以其簡單的REST風格API、分佈式特性、速度和可擴展性而聞名,是Elastic Stack的核心組件: Elastic Stack是適用於數據採集、充實、存儲、分析和可視化的一組開源工具。人們一般將Elastic Stack稱爲ELK Stack (代指ElasticsearchLogstashKibana),目前Elastic Stack包括一系列豐富的輕星型數據採集代理, 這些代理統稱爲Beats,可用來向Elasticsearch發送數據。node

1.2 Elasticsearch 的用途

Elasticsearch在速度和可擴展性方面表現出色,可以索引多種類型的內容,意味着能夠用於多種用例:docker

  • 應用程序搜索
  • 網站搜索
  • 企業搜索
  • 日誌處理分析
  • 基礎設施指標和容器檢測
  • 應用程序性能檢測
  • 地理空間數據分析和可視化
  • 安全分析
  • 業務分析

1.3 Elasticsearch 的工做原理

原始數據會從多個來源(包括日誌、系統指標和網絡應用程序)輸入到 Elasticsearch 中。數據採集指在Elasticsearch中進行索引以前解析、標準化並充實這些原始數據的過程。這些數據在 Elasticsearch 中索引完成以後,用戶即可針對他們的數據運行復雜的查詢,並使用聚合來檢索自身數據的複雜彙總。在 Kibana 中,用戶能夠基於本身的數據建立強大的可視化,分享儀表板,並對 Elastic Stack 進行管理。shell

1.4 Elasticsearch 索引是什麼?

Elasticsearch 索引指相互關聯的文檔集合。Elasticsearch 會以 JSON 文檔的形式存儲數據。每一個文檔都會在一組(字段或屬性的名稱)和它們對應的值(字符串、數字、布爾值、日期、數值組、地理位置或其餘類型的數據)之間創建聯繫。
Elasticsearch 使用的是一種名爲倒排索引的數據結構,這一結構的設計能夠容許十分快速地進行全文本搜索。倒排索引會列出在全部文檔中出現的每一個特有詞彙,而且能夠找到包含每一個詞彙的所有文檔。
在索引過程當中,Elasticsearch 會存儲文檔並構建倒排索引,這樣用戶即可以近實時地對文檔數據進行搜索。索引過程是在索引 API 中啓動的,經過此 API 您既可向特定索引中添加 JSON 文檔,也可更改特定索引中的 JSON 文檔。數據庫

2、 基本概念

2.1 Index(索引)

動詞: 至關於 MySQL 中的 insert
名詞: 至關於 MySQL 中的 Databasejson

2.2 Type(類型)

在 index (索引) 中,能夠定義一個或多個類型,相似於 MySQL 中的 Table ,每一種類型的數據放在一塊兒centos

把一條數據存在 ES 的某個索引的某個類型下,至關於 MySQL 的某個數據庫的某張表下api

2.3 Document (文檔)

保存在某個 索引(數據庫)下, 某種 類型(表) 的一個 Document 文檔(一條數據), 文檔是 JSON格式的,Document 就像是 MySQL 中的某個 Table 裏面的內容。安全

3、在Docker環境中安裝 ES + Kibana

3.1 下載鏡像

docker pull elasticsearch:7.4.2
docker pull kibana:7.4.2

3.2 建立實例

3.2.1 elasticsearch

先在本機中建立一個本身的目錄 , 如:/mydata/elasticsearch , 而後再目錄底下建立三個文件夾 dataconfigplugins,爲後面建立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實例便可。

3.2.2 kibana

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

4、初步檢索

4.1 _cat

4.1.1 查看節點信息

GET http://主機ip:9200/_cat/nodes

4.1.2 查看健康情況

GET http://主機ip:9200/_cat/health

4.1.3 查看主節點信息

GET http://主機ip:9200/_cat/master

4.1.3 查看全部的索引

GEThttp://主機ip:9200/_cat/indices

4.2 索引一個文檔

MySQL:保存一條數據到表中

保存一個數據,保存在哪一個索引的哪一個類型下, 能夠指定惟一標識

MySQL: 保存在哪一個數據庫的哪張表下

4.2.1 put帶ID保存

新增更新二合一,第一次發送爲新增,後面的則爲更新。不指定id會報錯,通常用作於修改
PUT /customer/external/1

{
    "name": "John Doe"
}

image-20201206214214767

4.2.2 POST保存

新增修改二合一,不帶ID或者帶ID可是以前沒有數據爲新增,帶ID且以前有數據,爲修改
PUT /customer/external/

{
    "name": "John Doe"
}

image-20201206215854098

4.3 查詢文檔

查詢 哪一個索引 下的 哪一個類型 下的 哪條數據

MySQL: 查詢哪一個數據庫下的哪張表的哪條數據

GET /customer/external/1

image-20201206215917659

_seq_no:併發控制字段,每次更新就會 +1 ,能夠用來作樂觀鎖
_primary_term:可用於作樂觀鎖,主分片從新分配,如重啓,就會變化
樂觀鎖使用:
更新前,先查詢出當前的數據,能夠獲取 當前 _seq_no 以及當前 _primary_term
更新的時候,帶上 ?if_seq_no={當前 _seq_no }&if_primary_term={當前 _primary_term}

4.4 更新文檔

4.1 POST 帶 _update 更新

POST /customer/external/1/_update

{
    # doc 的內容爲文檔的最新值
    "doc": {
    	"name": "John Doew"
    }
}

image-20201206222059851

POST 帶 _update 更新, 會對比原數據,若是更新的數據與原來一致,則 _version _seq_no不會變化, 且 result 的值爲 noop,意思爲沒有作任何操做,且能夠給原有的文檔中,新增一個屬性

{
    # 帶 _update doc不可省略, doc 的內容爲文檔的最新值
    "doc": {
    	"name": "John Doew",
    	"age": 20
    }
}

如上的請求也是能夠成功的

4.2 其餘更新

POST /customer/external/1

{
	"name": "John Doew"
}

PUT /customer/external/1

{
	"name": "John Doew"
}

以上兩種方式的更新,永遠爲更新操做,不會對比原來的操做,每次請求 _version _seq_no都在不斷疊加,且同 帶 _updte 的 POST 請求同樣,能夠爲原有文檔新增上新的屬性

4.5 刪除文檔&索引

發送 DELETE 請求, 須要指定到具體的文檔、索引
DELETE /customer/external/1
DELETE /customer

image-20201206223245179

在 ElasticSearch 中, 不提供刪除類型的方法

4.6 bulk 批量 API

必須發送 POST 請求,在 PostMan 中沒法模擬請求,這裏須要用到 kibana

POST /customer/external/_bulkcustomer 索引下的 external 類型中批量執行

# 一個大括號表明一個操做,兩行爲一個動做
{"index":{"_id": "1"}}	# 索引一個文檔,文檔的id爲1
{"name": "John Doe"}	# 文檔的內容
{"index":{"_id": "2"}}
{"name": "John Doe"}

image-20201208160711936

took :執行所花費的時間 errors : 是否有錯誤
items :獨立統計每條命令的執行結果,若是中間有某條命令執行失敗,後面的命令也不會受到影響,且命令執行失敗的時候,不會跟MySQL同樣,回滾

相關文章
相關標籤/搜索