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

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

1、安裝部署

一、Windows 單節點部署

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

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

二、Linux 單節點部署

Linux 單節點部署請參考下面的 Linux 集羣部署。編程

三、Linux 集羣部署

集羣部署能夠參考文章:CentOS 7.4 下安裝 ES 6.5.1 搜索集羣數組

2、基本概念

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

一、NRT

Elasticsearch 是一個接近實時(Near Real Time)的搜索平臺,也就是說,從創建索引,到這個索引能夠被搜索須要很小的延遲,一般是 1 秒。網絡

二、Cluster

一個集羣就是由一個或多個節點組織在一塊兒,這些節點共同持有所有的索引數據,並共同提供索引和搜索功能。一個集羣由一個惟一的名字標識,這個名字很重要,一個節點只能經過指定某個集羣的名字,來加入這個集羣。app

三、Node

一個節點就是集羣中的一個服務,做爲集羣的一部分,它能夠用來存儲數據,參與集羣的索引和搜索功能。對於許多應用場景來講,部署一個單節點的 ElasticSearch 服務就足夠了;可是考慮到容錯性和數據過載,配置多節點的 ElasticSearch 集羣是明智的選擇。elasticsearch

四、Index

一個索引就是一個擁有類似特徵的文檔(Document)的集合,ElasticSearch 把數據存放到一個或者多個索引中;一個索引由一個名字來標識,而且當咱們要對這個索引中的文檔進行索引、搜索、更新和刪除的時候,都要使用到這個名字。分佈式

五、Type

  • ES 6.0 以前:在一個索引中,能夠定義一種或多種類型;一個類型是索引的一個邏輯上的分類/分區;一般,會爲具備一組相同字段的文檔定義一個類型。
  • ES 6.0 及更高版本:建立的索引只包含單個映射類型,映射類型將在 ES 7.0 中將徹底移除。

許多人喜歡將index比喻爲關係型數據庫中的database,將type比喻爲關係型數據庫中的table,實際上這個比喻很是不貼切。由於在關係型數據庫中,表中的字段都是獨立的,可是在Elasticsearch中,在不一樣的type中,若是filed具備相同的名字,則這些不一樣的filed其實是由相同的Lucene Filed提供支持的,所以這種比喻並不恰當;另外一方面,在同一索引中存儲具備不多或沒有共同字段的不一樣實體會干擾Lucene有效壓縮文檔的能力。

六、Document

一個文檔是可被索引的基礎信息單元,文檔以 JSON 格式來表示,在一個 index/type 裏面,能夠存儲任意多的文檔。文檔由一個或者多個字段(Field)組成,每一個字段(Field)由一個字段名和一個或者多個值組成。

七、Shards and Replicas

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

Shards

爲了解決這個問題,Elasticsearch 提供了將索引劃分紅多片的能力,這些片叫作分片。當用戶建立一個索引的時候,能夠指定分片的數量(默爲 5,可是在 7.0 版本中默認會變爲 1);每一個分片自己也是一個功能完善而且獨立的「索引」,這個「索引」能夠被放置到集羣中的任何節點上。

分片之因此重要,主要有兩方面的緣由:

  • 容許水平分割/擴展內容容量;
  • 容許在分片(位於多個節點上)之上進行分佈式的、並行的操做,進而提升性能/吞吐量。

Replicas

至於一個分片怎樣分佈,它的文檔怎樣聚合回搜索請求,是徹底由 Elasticsearch 管理的,對於用戶來講,這些都是透明的。在一個網絡/雲的環境裏,失敗隨時均可能發生。在某個分片/節點由於某些緣由處於離線狀態或者消失的狀況下,故障轉移機制是很是有用且強烈推薦的。爲此,Elasticsearch 容許建立分片的一份或多份拷貝,這些拷貝叫作複製分片,或者直接叫複製。

複製之因此重要,有兩個主要緣由:

  • 在分片/節點失敗的狀況下,複製提供了高可用性;
  • 複製分片不與原/主要分片放置再相同節點上
  • 搜索能夠在全部的複製上並行運行,複製能夠擴展你的搜索量/吞吐量。

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

八、Field、Term、Token

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

ES 集羣結構

3、Mapping and Index Template

部份內容來源:論 Elasticsearch 數據建模的重要性

一、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 字段設置流程

二、Index Template

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

4、推薦閱讀


Any Code,Code Any!

掃碼關注『AnyCode』,編程路上,一塊兒前行。

相關文章
相關標籤/搜索