安裝ElasticSearch 是目前很是流行的搜索引擎,對海量數據搜索是很是友好,而且在高併發場景下,也能發揮出穩定,快速特色。也是大數據和索搜服務的開發人員所極力追捧的中間件。雖然 ElasticSearch 深受你們的喜好,可是它的迭代速度之快,因此在相關社區總是有據說到學不動了的話語,也正是這種不斷完善,才能擁有如今的社區活躍。我使用 ElasticSearch 時,從 5.x 到 6.x 版本,再到如今接觸到 7.x 版本。從版本升級中,也看到了 ElasticSearch 對主流技術變化的擁抱,最明顯的是新版 JDK 版本的支持及容器技術的支持。php
本文基於目前最新版本 ElasticSearch-7.5.0
進行操做,如官網下載太慢,可在【ytao公衆號】中發送 es
獲取下載連接。html
安裝環境及本文相關包:node
操做系統 CentOS7.564位
vim
ElasticSearch7.5.0
api
Kinbana7.5.0
bash
ElasticSearch 在 7.x 中自帶 JDK 環境,因此如今不必定要安裝 JDK。默認是先判斷當前服務器是否安裝 JDK,若是安裝了就使用服務器已安裝的 JDK,不然會使用自帶的 JDK,固然這個也是能夠手動設置。服務器
因爲 ElasticSearch 默認是不支持 root 帳號權限啓動,因此第一步要先建立啓動帳號。建立一個 ElasticSearch 的運行組 es:併發
groupadd es
app
在 es 組中建立用戶:jvm
useradd elastic -g es
設置新用戶密碼:
passwd elastic
給解壓出的 ElasticSearch 包受權:
chown -R elastic:es elasticsearch-7.5.0
進入到 /elasticsearch-7.5.0
目錄,在 config
目錄裏有個 elasticsearch.yml
文件,修改裏面當前須要的配置。
cluster.name 是所屬集羣的名稱
node.name 當前節點名稱
network.host 當前節點所綁定地址,綁定到 0.0.0.0
全部的訪問
http.port 對外提供服務的端口號
path.data 數據存儲目錄,這個我通常不適用默認目錄,可是要給自定義的目錄受權
path.log 日誌目錄,和 path.data 相似配置
另一個重要的配置,在當前目錄中的 jvm.options
文件設置。這裏設置堆內存大小,建議設置機器內存的 50% 大小。
-Xms4g
-Xmx4g
其餘配置暫時沒用到,暫不分析,從此的文章中用到再進行講解。
安裝配置文件設置的值默認啓動,直接執行 ./bin/elasticsearch
,果真不出乎所意料,啓動異常。
上圖中拋了兩個異常。
第一個是說虛擬內存過小,至少須要 262144。
第二個當前默認配置不適合,[discovery.seedhosts, discovery.seedproviders, cluster.initialmasternodes]配置中至少有一個配置。
如今就增大服務器虛擬內存:
# 編輯 sysctl.conf 文件 vim /etc/sysctl.conf # 在 sysctl.conf 中添加 vm.max_map_count=262144 # 查看剛設置的是否生效 sysctl -p
設置 cluster.initialmasternodes 配置參數:
cluster.initial_master_nodes: ["node-1"]
再次啓動完成後,沒有異常拋出,訪問 ip:9200
,返回數據信息,其中包括集羣名稱,節點名,版本信息等等:
在進行 API 操做前先安裝 kibana,如下命令執行將所有在 kibana 中執行。解壓 kibana 後,在 kibana.yml
中設置 ElasticSearch 地址 elasticsearch.hosts:["http://ip:9200"]
。經過 bin/kibana
進行啓動。安裝比較簡單,這裏不作詳細闡述。
建立 person 索引例子,numberofshards 爲分片數量,numberofreplicas 爲索引的副本數,這裏主要演示建立索引時可設置一些相關參數,且爲非必填項。
PUT /person { "mappings": { "properties": { "name": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256// 長度超過ignore_above設定的值,不會被索引或存儲 } } } } }, "settings": { "number_of_shards": 1, "number_of_replicas": 1 } }
執行命令結果:
使用 GET 請求方式查詢索引信息:
GET /person
返回結果
使用 DELETE 請求方式:
# 刪除 person 索引 DELETE /person # 刪除所有索引 DELETE /_all # 通配符刪除 DELETE /person*
查詢 person 索引的 mapping :
GET /person/_mapping
向 person 索引中添加 remark 字段,以前 mapping 中的 name 不會被刪除,。
POST /person/_mapping { "properties": { "remark2": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } }
添加文檔有兩種方式,第一種就是使用指定索引的 type 添加文檔,7.x開始,type 指定只能是 _doc 值,同時也是不支持多 type 的(ps:以前使用type主要用來將索引邏輯分區)。第二種就是使用 _create 進行建立數據。
使用 _doc
API向 person 中添加文檔:
PUT /person/_doc/1 { "name":"ytao", "blog":"公衆號 ytao", "remark":"https://ytao.top" }
添加文檔後返回的數據:
上面命令執行過程,若是索引或 mapping 不存在,都會自動建立。這裏的 id 咱們也能夠自動生成,可是請求不能使用 PUT 方式,要改成 POST 方式。
POST /person/_doc/ { "name":"ytao", "blog":"公衆號 ytao", "remark":"https://ytao.top" }
若是上面咱們插入 id 爲 1 的文檔重複執行,那麼會先刪除掉舊的文檔,再引用新的文檔,而且所對應的 _version
版本號值會較以前的 +1。
使用 _create
API向 person 添加文檔:
PUT /person/_create/2 { "name":"yangtao", "blog":"ytao's blog", "remark":"coder" }
這裏 id 必須指明,不然添加失敗,而且文檔中已存在的 id 不能進行添加。
使用 GET 獲取文檔:
GET /person/_doc/1
返回數據中:
使用 _search
API進行查詢,這裏暫時不作深刻講解。查詢 name 爲 ytao 的文檔,而且經過 from=0&size=2
分頁查詢。
# q 爲查詢參數,查詢的字段和值用 : 進行分割
GET /person/_search?q=name:ytao&from=0&size=2
返回結果:
更新文檔使用 _update
API進行更新。更新內容必須包含在 doc
中。更新對源數據只能是添加或修改字段,這也是和使用 _doc
添加數據的區別,不是經過刪除舊的文檔進行更新的。
POST /person/_update/1 { "doc":{ "blog":"ytao's blog" } }
文檔刪除使用 DELETE 請求,而後指定 id:
DELETE /person/_doc/1
批量處理能夠一次請求中處理多個任務,使用 _bulk
API進行。下面就以索引添加方式添加一個文檔到索引中,而後更新文檔中 blog 字段爲例。
POST _bulk {"index":{"_index":"person", "_id":1}} {"name":"ytao","blog":"公衆號 ytao","remark":"https://ytao.top"} {"update":{"_index":"person", "_id":1}} {"doc":{"blog":"ytao's blog"}}
返回結果中,按每個操做分別返回結果信息,當其中有請求錯誤時,不會影響其餘請求操做。
批量獲取文檔,使用 _mget
API進行,經過一次指定多個文檔 id,進行請求。例如在 person 索引中獲取 id 爲 1,2 的文檔:
POST _mget { "docs":[ { "_index": "person", "_id": 1 }, { "_index": "person", "_id": 2 } ] }
返回結果:
批量查詢文檔,使用 _msearch
API進行,將多個查詢整合到一個請求中。下面就是分別在指定索引中查詢的不一樣條件。
GET /person/_msearch {"index":"person"} {"query":{"match":{"blog":"ytao's blog"}}} {"index":"person"} {"query":{"match":{"remark":"coder"}}}
返回結果:
本文對 ElasticSearch 的最基礎的,經常使用的操做 API,這裏已經介紹完畢。要想學習 ElasticSearch,建議從 API 操做入手,千萬別上來就直接拿着代碼就幹,雖然各語言都已提供相關工具包,可是這些封裝也都是基於 API 上的。更多的 API 在從此文章涉及時再進行分析。
更多 API 相關信息,建議查閱官網,這裏有比較詳細的介紹:https://www.elastic.co/guide/en/elasticsearch/reference/7.5/rest-apis.html
-END-