elasticsearch入門

這篇教程主要是對在入門的elasticsearch的一個記錄。

ES 集羣安裝

安裝環境

基於 Dokcer ,單機安裝 Docker 版集羣。使用版本如下:

  • Elasticsearch 5.3.2
  • Kibana 5.3.2
  • JDK 8

整個安裝步驟分成三部分:

  1. 安裝 ES 集羣實例 elasticsearch001
  2. 安裝 ES 集羣實例 elasticsearch002
  3. 安裝 Kibana 監控

安裝 ES 集羣實例

安裝過程中鏡像拉取事件過長,這裏筆者將docker鏡像上傳到阿里的docker倉庫中。

安裝 ES 集羣實例 elasticsearch001:

docker run -d -p 9200:9200 \
    -p 9300:9300 \
    --name elasticsearch001 -h elasticsearch001 \
    -e cluster.name=lookout-es \
    -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
    -e xpack.security.enabled=false \
    registry.cn-hangzhou.aliyuncs.com/dingwenjiang/elasticsearch:5.3.2

命令解釋如下:

  • docker run: 會啓動一個容器實例,如果本地沒有對應的鏡像會去遠程registry上先下載鏡像。
  • -d: 表示容器運行在後臺
  • -p [宿主機端口]:[容器內端口]: 比如-p 9200:9200 表示把宿主機的9200端口映射到容器的9200端口
  • --name : 設置容器別名
  • -h : 指定容器的hostname
  • -e: 設置環境變量。這裏關閉 x-pack 的安全校驗功能,防止訪問認證。

通過curl http://localhost:9200/_cat/health?v=pretty來驗證elasticsearch001是否啓動成功,如下:
image
設置環境變量的時候,我們指定了-e cluster.name=lookout-es,用於後續關聯集羣用。node爲1 表示只有一個實例。默認 shards 分片爲主備兩個。status 狀態是我們要關心的,狀態可能是下列三個值之一:

  • green:所有的主分片和副本分片都已分配,集羣是 100% 可用的。
  • yellow:所有的主分片已經分片了,但至少還有一個副本是缺失的。不會有數據丟失,所以搜索結果依然是完整的。高可用會弱化把 yellow 想象成一個需要及時調查的警告。
  • red:至少一個主分片(以及它的全部副本)都在缺失中。這意味着你在缺少數據:搜索只能返回部分數據,而分配到這個分片上的寫入請求會返回一個異常。

也可以訪問 http://localhost:9200/ ,可以看到成功運行的案例,返回的 JSON 頁面。如圖:

clipboard.png

繼續搭建elasticsearch002:

docker run -d -p 9211:9200 \
       -p 9311:9300 --link elasticsearch001 \
       --name elasticsearch002 \
       -e cluster.name=lookout-es \
       -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
       -e xpack.security.enabled=false \
       -e discovery.zen.ping.unicast.hosts=elasticsearch001 \
       registry.cn-hangzhou.aliyuncs.com/dingwenjiang/elasticsearch:5.3.2

啓動elasticsearch002的時候增加了幾個參數,

  • --link [其他容器名]:[在該容器中的別名]: 添加鏈接到另一個容器, 在本容器 hosts 文件中加入關聯容器的記錄。
  • -e: 設置環境變量。這裏額外指定了 ES 集羣的 cluster.name、ES 集羣節點淡泊配置 discovery.zen.ping.unicast.hosts 設置爲實例 elasticsearch001。

再次執行curl http://localhost:9200/_cat/health?v=pretty,結果如圖:
clipboard.png

對比上面檢查數值可以看出,首先集羣狀態爲 green , 所有的主分片和副本分片都已分配。你的集羣是 100% 可用的。相應的 node 、shards 都增加。

安裝 Kibana 監控

接着安裝Kibana,對elasticsearch進行監控,安裝命令如下:

# 啓動kibana
docker run -d --name kibana001 \
       --link elasticsearch001 \
       -e ELASTICSEARCH_URL=http://elasticsearch001:9200 \
       -p 5601:5601\
         registry.cn-hangzhou.aliyuncs.com/dingwenjiang/kibana:5.3.2

其中-e 設置環境變量。這裏額外指定了 ELASTICSEARCH_URL 爲搜索實例地址。打開網頁訪問 127.0.0.1:5601,默認賬號爲 elasti,密碼爲 changeme。會出現如下的截圖:

clipboard.png

Spring Boot 整合 Elasticsearch

這裏只是簡單整合下,開發一個web接口,實現數據存儲以及查詢功能。開發的思路還是傳統的三層架構,controller、service、dao,這裏利用spring data來簡化對es的curd操作。
項目的repo地址:https://github.com/warjiang/d...

整個項目的結構如下所示:
clipboard.png

入口文件爲:Application類,其中也是大家熟悉的spring-boot的用法。
controller主要在api包下,這裏會暴露出兩個API接口,分別是/api/contents用於寫入內容、/api/content/search用於查詢
service主要在service包下,與controller對應,需要實現寫入和查詢兩個方法
dao主要在repository包下,繼承ElasticsearchRepository,實現curd。
這裏需要注意的時候,讀寫的bean用的是entity包下的ContentEntity,實際上services中操作的的bean是bean包下的ContentBean。
後續具體的實現在這裏不再贅述。

項目運行起來後,可以發送寫入和查詢的請求來測試功能的正確性。
寫入請求:可以通過curl 或者postman構造一個請求如下:

POST /api/contents HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
Cache-Control: no-cache

[
    {
        "id":1,
        "title":"《見識》",
        "content":"摩根說:任意讓小錢從身邊溜走的人,一定留不住大錢",
        "type":1,
        "category":"文學",
        "read":999,
        "support":100
    },
    {
        "id":2,
        "title":"《態度》",
        "content":"人類的幸福不是來自偶然的幸運,而是來自每天的小恩惠",
        "type":2,
        "category":"文學",
        "read":888,
        "support":88
    },
    {
        "id":3,
        "title":"《Java 編程思想》",
        "content":"Java 是世界上最diao的語言",
        "type":2,
        "category":"計算",
        "read":999,
        "support":100
    }
]

請求成功會返回如下所示:

{
    "code": 0,
    "message": "success",
    "data": true
}

寫入成功後可以到kibana中查看寫入結果,打開網頁訪問 localhost:5601,在 Kibana 監控中輸入需要監控的 index name 爲 content。如下圖,取消打鉤,然後進入:
clipboard.png

進入後,會得到如圖所示的界面,裏面羅列了該索引 content 下面所有字段:
圖片描述

打開左側 Discover 欄目,即可看到可視化的搜索界面及數據:
圖片描述

隨便打開一個json如下:

{
  "_index": "content",
  "_type": "content",
  "_id": "2",
  "_score": 1,
  "_source": {
    "id": 2,
    "title": "《態度》",
    "content": "人類的幸福不是來自偶然的幸運,而是來自每天的小恩惠",
    "type": 2,
    "category": "文學",
    "read": 888,
    "support": 88
  }
}
  • _index 就是索引,用於區分文檔成組,即分到一組的文檔集合。索引,用於存儲文檔和使文檔可被搜索。
  • _type 就是類型,用於區分索引中的文檔,即在索引中對數據邏輯分區。比如索引 project 的項目數據,根據項目類型 ui 項目、插畫項目等進行區分。
  • _id 是該文檔的唯一標示,代碼中我們一 ID 作爲他的唯一標示。

查詢請求:可以通過curl 或者postman構造一個請求如下:

POST /api/content/search HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
Cache-Control: no-cache

{
    "searchContent":"Java",
    "type":2,
    "pageSize":3,
    "pageNumber":0
}

對應結果如下:

{
    "code": 0,
    "message": "success",
    "data": {
        "pageNumber": 0,
        "pageSize": 3,
        "totalPage": 1,
        "totalCount": 1,
        "result": [
            {
                "id": 3,
                "title": "《Java 編程思想》",
                "content": "Java 是世界上最diao的語言",
                "type": 2,
                "category": "計算",
                "read": 999,
                "support": 100
            }
        ]
    }
}

這裏根據 searchContent 匹配短語 +type 匹配單個字段,一起構建了搜索語句。用於搜索出我們期待的結果,就是《Java 編程思想》。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章