ES 入門(一):安裝部署與基本概念

rochy_he發表於2019-02-14

本文參考了多篇入門和進階文章,主要介紹了 ES 安裝部署、ES 基本概念、對映和索引模板相關的內容。

一、安裝部署

1、Windows 單節點部署

對於 Windows 系統,安裝 Elasticsearch 最為簡單,直接從官方網址下載 ES 的安裝包(.zip),下載完成後解壓到本地磁碟的某個資料夾;待解壓完成後,進入安裝根路徑的 bin 目錄,雙擊 elasticsearch.bat 即可開始使用。

安裝使用 ES 前,請保證 Java 已經安裝成功,確保已設定 JAVA_HOME 環境變數。

2、Linux 單節點部署

Linux 單節點部署請參考下面的 Linux 叢集部署。

3、Linux 叢集部署

叢集部署可以參考文章:CentOS 7.4 下安裝 ES 6.5.1 搜尋叢集

二、基本概念

部分內容來源:Elasticsearch安裝與配置

1、NRT

Elasticsearch 是一個接近實時(Near Real Time)的搜尋平臺,也就是說,從建立索引,到這個索引可以被搜尋需要很小的延遲,通常是 1 秒。

2、Cluster

一個叢集就是由一個或多個節點組織在一起,這些節點共同持有全部的索引資料,並共同提供索引和搜尋功能。一個叢集由一個唯一的名字標識,這個名字很重要,一個節點只能通過指定某個叢集的名字,來加入這個叢集。

3、Node

一個節點就是叢集中的一個服務,作為叢集的一部分,它可以用來儲存資料,參與叢集的索引和搜尋功能。對於許多應用場景來說,部署一個單節點的 ElasticSearch 服務就足夠了;但是考慮到容錯性和資料過載,配置多節點的 ElasticSearch 叢集是明智的選擇。

4、Index

一個索引就是一個擁有相似特徵的文件(Document)的集合,ElasticSearch 把資料存放到一個或者多個索引中;一個索引由一個名字來標識,並且當我們要對這個索引中的文件進行索引、搜尋、更新和刪除的時候,都要使用到這個名字。

5、Type

  • ES 6.0 之前:在一個索引中,可以定義一種或多種型別;一個型別是索引的一個邏輯上的分類/分割槽;通常,會為具有一組相同欄位的文件定義一個型別。
  • ES 6.0 及更高版本:建立的索引只包含單個對映型別,對映型別將在 ES 7.0 中將完全移除。

許多人喜歡將index比喻為關係型資料庫中的database,將type比喻為關係型資料庫中的table,實際上這個比喻非常不貼切。因為在關係型資料庫中,表中的欄位都是獨立的,但是在Elasticsearch中,在不同的type中,如果filed具有相同的名字,則這些不同的filed實際上是由相同的Lucene Filed提供支援的,因此這種比喻並不恰當;另一方面,在同一索引中儲存具有很少或沒有共同欄位的不同實體會干擾Lucene有效壓縮文件的能力。

6、Document

一個文件是可被索引的基礎資訊單元,文件以 JSON 格式來表示,在一個 index/type 裡面,可以儲存任意多的文件。文件由一個或者多個欄位(Field)組成,每個欄位(Field)由一個欄位名和一個或者多個值組成。

7、Shards and Replicas

一個索引可以儲存超出單個節點硬體限制的資料,例如一個具有 100 億文件的索引佔據 10TB 的磁碟空間,而任一節點可能沒有這樣大的磁碟空間來儲存,或者單個節點處理搜尋請求,響應會太慢。

Shards

為了解決這個問題,Elasticsearch 提供了將索引劃分成多片的能力,這些片叫做分片。當使用者建立一個索引的時候,可以指定分片的數量(默為 5,但是在 7.0 版本中預設會變為 1);每個分片本身也是一個功能完善並且獨立的“索引”,這個“索引”可以被放置到叢集中的任何節點上。

分片之所以重要,主要有兩方面的原因:

  • 允許水平分割/擴充套件內容容量;
  • 允許在分片(位於多個節點上)之上進行分散式的、並行的操作,進而提高效能/吞吐量。

Replicas

至於一個分片怎樣分佈,它的文件怎樣聚合回搜尋請求,是完全由 Elasticsearch 管理的,對於使用者來說,這些都是透明的。在一個網路/雲的環境裡,失敗隨時都可能發生。在某個分片/節點因為某些原因處於離線狀態或者消失的情況下,故障轉移機制是非常有用且強烈推薦的。為此,Elasticsearch 允許建立分片的一份或多份拷貝,這些拷貝叫做複製分片,或者直接叫複製。

複製之所以重要,有兩個主要原因:

  • 在分片/節點失敗的情況下,複製提供了高可用性;
  • 複製分片不與原/主要分片放置再相同節點上
  • 搜尋可以在所有的複製上並行執行,複製可以擴充套件你的搜尋量/吞吐量。

總之,每個索引可以被分成多個分片,一個索引也可以被複制 0 次或多次;分片和複製的數量可以在索引建立的時候指定,索引建立之後,可以在任何時候動態地改變複製的數量,但是不能再改變分片的數量。

8、Field、Term、Token

  • Field:它是 Document 的組成部分,由兩部分組成,名稱(name)和值(value);
  • Term:它是搜尋的基本單位,其表現形式為文字中的一個詞;
  • Token:它是單個 Term 在所屬 Field 中文字的呈現形式,包含了 Term 內容、Term 型別、Term 在文字中的起始及偏移位置。

ES 叢集結構

三、Mapping and Index Template

部分內容來源:論 Elasticsearch 資料建模的重要性

1、Mapping

對映(Mapping)是定義文件(Document)及其包含的欄位(Field)的儲存和索引方式的過程。

例如,使用對映來定義:

  • 哪些字串欄位需要進行全文檢索;
  • 哪些欄位資料型別為數字)、日期或地理位置;
  • 是否應將文件中所有欄位的值索引到 _all 欄位中;
  • 日期型別的格式(format);
  • 用於控制動態新增欄位的對映的自定義規則。

資料建模

Elasticsearch 資料建模注意事項

資料型別

Elasticsearch 資料型別

text 型別
  • 特性:分詞,將大段的文字根據分詞器切分成獨立的詞或者片語,以便全文檢索;
  • 適用:email 內容、產品的描述等需要分詞並全文檢索的欄位;
  • 不適用:精準查詢、過濾、排序或聚合(Significant Terms 聚合例外)。
keyword 型別
  • 特性:無需分詞、整段完整精確匹配;
  • 適用:email 地址、狀態碼、分類 tags、電話號碼、主外來鍵等;
  • 也適用:支援類似 mysql like 的查詢;
  • 特別適用:精準查詢、過濾、排序或聚合;
  • 不適用:需要全文檢索、內容過長的欄位。
數值型別
  • long:帶符號的 64 位整數;
  • integer:帶符號的 32 位整數;
  • short:帶符號的 16 位整數;
  • byte:帶符號的 8 位整數;
  • double:雙精度 64 位 IEEE 754 浮點數;
  • float:單精度 32 位 IEEE 754 浮點數;
  • half_float:半精度 16 位 IEEE 754 浮點數;
  • scaled_float:由長度固定的縮放因子支援的浮點數。
日期型別

日期支援時間戳和字串,具體根據日期欄位 format 的設定;

  • epoch_millis:時間戳(毫秒);
  • strict_date_optional_time:通用 ISO 日期時間解析器,其中日期是必需的,時間是可選的。
"dtm_field": {
  "mapping": {
    "type": "date",
    "format": "yyyy-MM-dd HH:mm:ss||yyyy/MM/dd HH:mm:ss||strict_date_optional_time||epoch_millis",
    "store": "true"
  }
}
複製程式碼

可以通過設定索引 mapping 的 dynamic_date_formats 引數來設定索引動態日期檢測所匹配的日期格式。

布林型別
  • falsefalse,“false”,“off”,“no”,“0”,“”(空字串),0,0.0
  • true:以上 false 示例的反面,一切非假值。
二進位制型別

二進位制型別接受二進位制值作為 Base64 編碼字串,該欄位預設情況下不儲存,不可搜尋;可用於儲存小圖片,小文件等。

範圍型別
  • integer_range:整型範圍型別;
  • float_range:單精度浮點範圍型別;
  • long_range:長整型範圍型別;
  • double_range:雙精度範圍型別;
  • date_range:時間範圍型別;
  • ip_range:IP 範圍型別
Array 陣列型別

預設情況下,任何欄位都可以包含零個或多個值,但是陣列中的所有值必須是相同的資料型別。陣列型別將單個陣列元素做為一個資料單元,如果是分詞的話也只是會依單個陣列元素作為詞源進行分詞,不會將所有的陣列元素整合到一起。在查詢的時候如果陣列裡面的元素有一個能夠命中那麼將視為命中

當使用 script 指令碼時,使用 doc['xxxx'][0] 即可獲取欄位的值,等同於常規情況下的 doc['xxxx'].value

object 物件型別

文件可能包含內部物件,而內部物件又可能包含其他內部物件。

## 使用者寫入
{ 
  "region": "US",
  "manager": { 
    "age": 30,
    "name": { 
      "first": "John",
      "last":  "Smith"
    }
  }
}

## 實際儲存
{
  "region": "US",
  "manager.age": 30,
  "manager.name.first": "John",
  "manager.name.last":  "Smith"
}
複製程式碼
nested 巢狀型別

nested 巢狀型別是 object 資料型別的特定版本,允許物件陣列彼此獨立地進行索引和查詢。

## 使用者寫入
{
  "group" : "fans",
  "user" : [ 
    {
      "first" : "John",
      "last" :  "Smith"
    },
    {
      "first" : "Alice",
      "last" :  "White"
    }
  ]
}

## 實際儲存
{
  "group" : "fans",
  "user.first" : [ "alice", "john" ],
  "user.last" :  [ "smith", "white" ]
}
複製程式碼

預設情況下,每個索引最多建立 50 個巢狀文件,可以通過索引設定選項:index.mapping.nested_fields.limit 修改預設的限制。

ip 型別

儲存 IPV4 或 IPV6 地址。

geo_point 型別

geo_point 型別欄位儲存經緯度資訊,可以用於:

  • 在邊界框內,在中心點的特定距離內或在多邊形內查詢地理點;
  • 通過地理位置或距離中心點的距離來聚合文件;
  • 將距離整合到文件的相關性分數中;
  • 按距離對檔案進行排序。
completion 型別

請參考文章:Elasticsearch Suggester詳解

Mapping 設定

Elasticsearch Mapping 設定

型別選擇

Elasticsearch 欄位設定流程

2、Index Template

請參考文章:基於 IK 分詞器的 ES 通用索引模板

四、推薦閱讀


Any Code,Code Any!

掃碼關注『AnyCode』,程式設計路上,一起前行。

ES 入門(一):安裝部署與基本概念

相關文章