本文參考了多篇入門和進階文章,主要介紹了 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 在文字中的起始及偏移位置。
三、Mapping and Index Template
部分內容來源:論 Elasticsearch 資料建模的重要性
1、Mapping
對映(Mapping)是定義文件(Document)及其包含的欄位(Field)的儲存和索引方式的過程。
例如,使用對映來定義:
- 哪些字串欄位需要進行全文檢索;
- 哪些欄位資料型別為數字)、日期或地理位置;
- 是否應將文件中所有欄位的值索引到
_all
欄位中; - 日期型別的格式(format);
- 用於控制動態新增欄位的對映的自定義規則。
資料建模
資料型別
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
引數來設定索引動態日期檢測所匹配的日期格式。
布林型別
false
:false,“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 設定
型別選擇
2、Index Template
請參考文章:基於 IK 分詞器的 ES 通用索引模板
四、推薦閱讀
Any Code,Code Any!
掃碼關注『AnyCode』,程式設計路上,一起前行。