Elasticsearch入门 - 核心概念详解

@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;
}

核心概念

1. document(文档)

es 中的最小数据单元,一个 document 可以是一条商品数据,也可以是一条订单数据,通常用 JSON 格式表示,一个 document 里面有多个 field,每个 field 就是一个数据字段。

以下是一个商品 document:

{
  "id": "1",
  "name": "Macbook pro 2018",
  "desc": "2018年新款 配置: xxxxxxx",
  "category_id": "2",
}

2. index(索引)

包含一堆有相似结构的文档数据,比如一个商品分类索引,订单索引,索引有一个名称。一个 index 包含很多 document,一个 index 就代表了一类类似的或者相同的 document。比如说建立一个商品 index,里面可能就存放了所有的商品数据,所有的商品 document。

3. type(类型)

每个索引里都可以有一个或多个 type,type 是 index 中的一个逻辑数据分类,一个 type 下的 document,都有部分相同的 field。

比如:商品index,里面存放了所有的商品document, 而商品分很多种类,每个种类的document的 field 可能不太一样,比如说电器商品,可能会包含如售后时间;生鲜类商品包含保质期这样的的field

举例说明:

一个商品 index,包含电器商品type 和 生鲜商品type

每一个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
}

4. cluster(集群)及 node(节点)

一个集群包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称,默认是elasticsearch)来决定的。

节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操作的时候),默认节点会去加入一个名称为“elasticsearch”的集群,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群

5. shard

单台机器无法存储大量数据,es 可以将一个索引中的数据切分为多个 shard,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。每个shard都是一个lucene index。

6. replica

任何一个服务器随时可能故障或宕机,此时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;
}