咱們在Elasticsearch - 概念篇中,提到不要急於寫代碼,當時還貼出以下一段代碼,裏面不少註解都看不懂什麼意思,本篇介紹完幾個核心概念後,再去看代碼就會明朗不少。node
@Document(indexName = "item",type = "docs", shards = 1, replicas = 0) public class Item { [@Id](https://my.oschina.net/u/3451001) private Long id; @Field(type = FieldType.Text, analyzer = "ik_max_word") private String title; @Field(type = FieldType.Keyword) private String category; }
es 中的最小數據單元,一個 document 能夠是一條商品數據,也能夠是一條訂單數據,一般用 JSON 格式表示,一個 document 裏面有多個 field,每一個 field 就是一個數據字段。服務器
如下是一個商品 document:運維
{ "id": "1", "name": "Macbook pro 2018", "desc": "2018年新款 配置: xxxxxxx", "category_id": "2", }
包含一堆有類似結構的文檔數據,好比一個商品分類索引,訂單索引,索引有一個名稱。一個 index 包含不少 document,一個 index 就表明了一類相似的或者相同的 document。好比說創建一個商品 index,裏面可能就存放了全部的商品數據,全部的商品 document。elasticsearch
每一個索引裏均可以有一個或多個 type,type 是 index 中的一個邏輯數據分類,一個 type 下的 document,都有部分相同的 field。性能
好比:商品index,裏面存放了全部的商品document, 而商品分不少種類,每一個種類的document的 field 可能不太同樣,好比說電器商品,可能會包含如售後時間;生鮮類商品包含保質期這樣的的field.net
舉例說明:code
一個商品 index,包含電器商品type 和 生鮮商品typeblog
每個type裏面,都會包含一堆 document索引
{ "id": "2", "name": "長虹電視機", "desc": "4k高清", "category_id": "3", "service_period": "1年"// 特殊 field } { "id": "3", "name": "基圍蝦", "desc": "純自然,冰島產", "category_id": "4", "eat_period": "7天" // 特殊 field }
一個集羣包含多個節點,每一個節點屬於哪一個集羣是經過一個配置(集羣名稱,默認是elasticsearch)來決定的。文檔
節點也有一個名稱(默認是隨機分配的),節點名稱很重要(在執行運維管理操做的時候),默認節點會去加入一個名稱爲「elasticsearch」的集羣,若是直接啓動一堆節點,那麼它們會自動組成一個elasticsearch集羣,固然一個節點也能夠組成一個elasticsearch集羣
單臺機器沒法存儲大量數據,es 能夠將一個索引中的數據切分爲多個 shard,分佈在多臺服務器上存儲。有了shard就能夠橫向擴展,存儲更多數據,讓搜索和分析等操做分佈到多臺服務器上去執行,提高吞吐量和性能。每一個shard都是一個lucene index。
任何一個服務器隨時可能故障或宕機,此時shard可能就會丟失,所以能夠爲每一個shard建立多個replica副本。replica能夠在shard故障時提供備用服務,保證數據不丟失,多個replica還能夠提高搜索操做的吞吐量和性能。
注意:
primary shard(創建索引時一次設置,不能修改,默認5個)
replica shard(隨時修改數量,默認1個)
默認每一個索引10個shard,5個primary shard,5個replica shard,最小的高可用配置,是2臺服務器。
當咱們熟悉並瞭解 Elasticsearch 的核心概念後,再來看下面的代碼,就能看懂 90% 左右了。
@Document(indexName = "item",type = "docs", shards = 1, replicas = 0) public class Item { @Id private Long id; @Field(type = FieldType.Text, analyzer = "ik_max_word") private String title; @Field(type = FieldType.Keyword) private String category; }