咱们在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; }