本文參考了多篇入門和進階文章,主要介紹了 ES 安裝部署、ES 基本概念、映射和索引模板相關的內容。mysql
對於 Windows 系統,安裝 Elasticsearch 最爲簡單,直接從官方網址下載 ES 的安裝包(.zip),下載完成後解壓到本地磁盤的某個文件夾;待解壓完成後,進入安裝根路徑的 bin 目錄,雙擊 elasticsearch.bat
便可開始使用。sql
安裝使用 ES 前,請保證 Java 已經安裝成功,確保已設置
JAVA_HOME
環境變量。數據庫
Linux 單節點部署請參考下面的 Linux 集羣部署。編程
集羣部署能夠參考文章:CentOS 7.4 下安裝 ES 6.5.1 搜索集羣數組
部份內容來源:Elasticsearch安裝與配置bash
Elasticsearch 是一個接近實時(Near Real Time)的搜索平臺,也就是說,從創建索引,到這個索引能夠被搜索須要很小的延遲,一般是 1 秒。網絡
一個集羣就是由一個或多個節點組織在一塊兒,這些節點共同持有所有的索引數據,並共同提供索引和搜索功能。一個集羣由一個惟一的名字標識,這個名字很重要,一個節點只能經過指定某個集羣的名字,來加入這個集羣。app
一個節點就是集羣中的一個服務,做爲集羣的一部分,它能夠用來存儲數據,參與集羣的索引和搜索功能。對於許多應用場景來講,部署一個單節點的 ElasticSearch 服務就足夠了;可是考慮到容錯性和數據過載,配置多節點的 ElasticSearch 集羣是明智的選擇。elasticsearch
一個索引就是一個擁有類似特徵的文檔(Document)的集合,ElasticSearch 把數據存放到一個或者多個索引中;一個索引由一個名字來標識,而且當咱們要對這個索引中的文檔進行索引、搜索、更新和刪除的時候,都要使用到這個名字。分佈式
許多人喜歡將index比喻爲關係型數據庫中的database,將type比喻爲關係型數據庫中的table,實際上這個比喻很是不貼切。由於在關係型數據庫中,表中的字段都是獨立的,可是在Elasticsearch中,在不一樣的type中,若是filed具備相同的名字,則這些不一樣的filed其實是由相同的Lucene Filed提供支持的,所以這種比喻並不恰當;另外一方面,在同一索引中存儲具備不多或沒有共同字段的不一樣實體會干擾Lucene有效壓縮文檔的能力。
一個文檔是可被索引的基礎信息單元,文檔以 JSON 格式來表示,在一個 index/type
裏面,能夠存儲任意多的文檔。文檔由一個或者多個字段(Field)組成,每一個字段(Field)由一個字段名和一個或者多個值組成。
一個索引能夠存儲超出單個節點硬件限制的數據,例如一個具備 100 億文檔的索引佔據 10TB 的磁盤空間,而任一節點可能沒有這樣大的磁盤空間來存儲,或者單個節點處理搜索請求,響應會太慢。
爲了解決這個問題,Elasticsearch 提供了將索引劃分紅多片的能力,這些片叫作分片。當用戶建立一個索引的時候,能夠指定分片的數量(默爲 5,可是在 7.0 版本中默認會變爲 1);每一個分片自己也是一個功能完善而且獨立的「索引」,這個「索引」能夠被放置到集羣中的任何節點上。
分片之因此重要,主要有兩方面的緣由:
至於一個分片怎樣分佈,它的文檔怎樣聚合回搜索請求,是徹底由 Elasticsearch 管理的,對於用戶來講,這些都是透明的。在一個網絡/雲的環境裏,失敗隨時均可能發生。在某個分片/節點由於某些緣由處於離線狀態或者消失的狀況下,故障轉移機制是很是有用且強烈推薦的。爲此,Elasticsearch 容許建立分片的一份或多份拷貝,這些拷貝叫作複製分片,或者直接叫複製。
複製之因此重要,有兩個主要緣由:
總之,每一個索引能夠被分紅多個分片,一個索引也能夠被複制 0 次或屢次;分片和複製的數量能夠在索引建立的時候指定,索引建立以後,能夠在任什麼時候候動態地改變複製的數量,可是不能再改變分片的數量。
部份內容來源:論 Elasticsearch 數據建模的重要性
映射(Mapping)是定義文檔(Document)及其包含的字段(Field)的存儲和索引方式的過程。
例如,使用映射來定義:
_all
字段中;like
的查詢;long
:帶符號的 64 位整數;integer
:帶符號的 32 位整數;short
:帶符號的 16 位整數;byte
:帶符號的 8 位整數;double
:雙精度 64 位 IEEE 754 浮點數;float
:單精度 32 位 IEEE 754 浮點數;half_float
:半精度 16 位 IEEE 754 浮點數;日期支持時間戳和字符串,具體根據日期字段 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 範圍類型默認狀況下,任何字段均可以包含零個或多個值,可是數組中的全部值必須是相同的數據類型。數組類型將單個數組元素作爲一個數據單元,若是是分詞的話也只是會依單個數組元素做爲詞源進行分詞,不會將全部的數組元素整合到一塊兒。在查詢的時候若是數組裏面的元素有一個可以命中那麼將視爲命中。
當使用 script 腳本時,使用
doc['xxxx'][0]
便可獲取字段的值,等同於常規狀況下的doc['xxxx'].value
。
文檔可能包含內部對象,而內部對象又可能包含其餘內部對象。
## 用戶寫入
{
"region": "US",
"manager": {
"age": 30,
"name": {
"first": "John",
"last": "Smith"
}
}
}
## 實際存儲
{
"region": "US",
"manager.age": 30,
"manager.name.first": "John",
"manager.name.last": "Smith"
}
複製代碼
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
修改默認的限制。
存儲 IPV4 或 IPV6 地址。
geo_point
類型字段存儲經緯度信息,能夠用於:
請參考文章:Elasticsearch Suggester詳解
請參考文章:基於 IK 分詞器的 ES 通用索引模板
Any Code,Code Any!
掃碼關注『AnyCode』,編程路上,一塊兒前行。