Elasticsearch入门 - 核心概念详解

开篇

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

核心概念

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。elasticsearch

3. type(类型)

每一个索引里均可以有一个或多个 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
}

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;
}
相关文章
相关标签/搜索