ElasticSearch之安裝及基本操做API

ElasticSearch 是目前很是流行的搜索引擎,對海量數據搜索是很是友好,而且在高併發場景下,也能發揮出穩定,快速特色。也是大數據和索搜服務的開發人員所極力追捧的中間件。雖然 ElasticSearch 深受你們的喜好,可是它的迭代速度之快,因此在相關社區總是有據說到學不動了的話語,也正是這種不斷完善,才能擁有如今的社區活躍。我使用 ElasticSearch 時,從 5.x 到 6.x 版本,再到如今接觸到 7.x 版本。從版本升級中,也看到了 ElasticSearch 對主流技術變化的擁抱,最明顯的是新版 JDK 版本的支持及容器技術的支持。html

安裝

本文基於目前最新版本ElasticSearch-7.5.0進行操做,如官網下載太慢,可在【ytao公衆號】中發送es獲取下載連接。node

安裝環境及本文相關包:vim

操做系統	CentOS 7.5 64位
ElasticSearch 7.5.0
Kinbana 7.5.0

JDK 環境

ElasticSearch 在 7.x 中自帶 JDK 環境,因此如今不必定要安裝 JDK。默認是先判斷當前服務器是否安裝 JDK,若是安裝了就使用服務器已安裝的 JDK,不然會使用自帶的 JDK,固然這個也是能夠手動設置。api

建立啓動帳號

因爲 ElasticSearch 默認是不支持 root 帳號權限啓動,因此第一步要先建立啓動帳號。 建立一個 ElasticSearch 的運行組 es:bash

groupadd es

在 es 組中建立用戶:服務器

useradd elastic -g es

設置新用戶密碼:併發

passwd elastic

給解壓出的 ElasticSearch 包受權:app

chown -R elastic:es elasticsearch-7.5.0

修改配置文件

進入到/elasticsearch-7.5.0目錄,在config目錄裏有個elasticsearch.yml文件,修改裏面當前須要的配置。jvm

  • cluster.name 是所屬集羣的名稱
  • node.name 當前節點名稱
  • network.host 當前節點所綁定地址,綁定到0.0.0.0全部的訪問
  • http.port 對外提供服務的端口號
  • path.data 數據存儲目錄,這個我通常不適用默認目錄,可是要給自定義的目錄受權
  • path.log 日誌目錄,和 path.data 相似配置

另一個重要的配置,在當前目錄中的jvm.options文件設置。 這裏設置堆內存大小,建議設置機器內存的 50% 大小。elasticsearch

-Xms4g
-Xmx4g

其餘配置暫時沒用到,暫不分析,從此的文章中用到再進行講解。

啓動

安裝配置文件設置的值默認啓動,直接執行./bin/elasticsearch,果真不出乎所意料,啓動異常。

上圖中拋了兩個異常。

  • 第一個是說虛擬內存過小,至少須要 262144。
  • 第二個當前默認配置不適合,[discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes]配置中至少有一個配置。

如今就增大服務器虛擬內存:

# 編輯 sysctl.conf 文件
vim /etc/sysctl.conf

# 在 sysctl.conf 中添加
vm.max_map_count=262144

# 查看剛設置的是否生效
sysctl -p

設置 cluster.initial_master_nodes 配置參數:

cluster.initial_master_nodes: ["node-1"]

再次啓動完成後,沒有異常拋出,訪問ip:9200,返回數據信息,其中包括集羣名稱,節點名,版本信息等等:

基本操做API

在進行 API 操做前先安裝 kibana,如下命令執行將所有在 kibana 中執行。解壓 kibana 後,在kibana.yml中設置 ElasticSearch 地址elasticsearch.hosts: ["http://ip:9200"]。經過bin/kibana進行啓動。安裝比較簡單,這裏不作詳細闡述。

索引操做

建立索引

建立 person 索引例子,number_of_shards 爲分片數量,number_of_replicas 爲索引的副本數,這裏主要演示建立索引時可設置一些相關參數,且爲非必填項。

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 在從此文章涉及時再進行分析。

更多 API 相關信息,建議查閱官網,這裏有比較詳細的介紹: https://www.elastic.co/guide/en/elasticsearch/reference/7.5/rest-apis.html

我的博客: https://ytao.top

關注公衆號 【ytao】,更多原創好文

個人公衆號

相關文章
相關標籤/搜索