ElasticSearch 是目前非常流行的搜尋引擎,對海量數據搜索是非常友好,並且在高並發場景下,也能發揮出穩定,快速特點。也是大數據和索搜服務的開發人員所極力追捧的中間件。雖然 ElasticSearch 深受大家的喜愛,但是它的迭代速度之快,所以在相關社區老是有聽說到學不動了的話語,也正是這種不斷完善,才能擁有現在的社區活躍。我使用 ElasticSearch 時,從 5.x 到 6.x 版本,再到現在接觸到 7.x 版本。從版本升級中,也看到了 ElasticSearch 對主流技術變化的擁抱,最明顯的是新版 JDK 版本的支持及容器技術的支持。
安裝本文基於目前最新版本 ElasticSearch-7.5.0進行操作,如官網下載太慢
安裝環境及本文相關包:
作業系統 CentOS 7.5 64位
ElasticSearch 7.5.0
Kinbana 7.5.0
JDK 環境ElasticSearch 在 7.x 中自帶 JDK 環境,所以現在不一定要安裝 JDK。默認是先判斷當前伺服器是否安裝 JDK,如果安裝了就使用伺服器已安裝的 JDK,否則會使用自帶的 JDK,當然這個也是可以手動設置。
創建啟動帳號由於 ElasticSearch 默認是不支持 root 帳號權限啟動,所以第一步要先創建啟動帳號。創建一個 ElasticSearch 的運行組 es:
groupadd es
在 es 組中創建用戶:
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,果然不出乎所意料,啟動異常。
上圖中拋了兩個異常。
現在就增大伺服器虛擬內存:
# 編輯 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在進行 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*
mapping 操作查詢 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 進行創建數據。
index 方式添加文檔使用 _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 方式添加文檔使用 _create API向 person 添加文檔:
PUT /person/_create/2
{
"name":"yangtao",
"blog":"ytao's blog",
"remark":"coder"
}
這裡 id 必須指明,否則添加失敗,並且文檔中已存在的 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 在今後文章涉及時再進行分析。