本文是《ElasticSearch搜索引擎详解》系列文章的第三篇:ElasticSearch详解——3.ES索引的创建过程详解。 有兴趣的读者可以订阅《ElasticSearch搜索引擎详解》专栏,及时获取最新文章通知。
说明:本文章使用的ES版本是:**6.7.0
**
上一篇文章ElasticSearch详解——2.阅读源码详解ES启动过程跟着代码,详细说明了ES的启动过程。这一篇文章主要详细说明ES比较关键的问题:ES中的索引是如何创建的。
在ES启动过程中,创建Node对象(new Node(environment))时,初始化了RestHandler,由其名字可以知道这是用来处理Rest请求的。
在ES源码中,RestHandlerAction如下图:
其中:
接下来我们具体的看一下ES是如何创建索引的:org.elasticsearch.rest.action.document.RestIndexAction
一个完整的ES集群由以下几个基本元素组成
名称 | 概念 | 对应关系型数据库概念 | 说明 |
---|---|---|---|
Cluster | 集群 | 一个或多个节点的集合,通过启动时指定名字作为唯一标识,默认cluster-state | |
node | 节点 | 启动的ES的单个实例,保存数据并具有索引和搜索的能力,通过名字唯一标识,默认node-n | |
index | 索引 | Database | 具有相似特点的文档的集合,可以对应为关系型数据库中的数据库,通过名字在集群内唯一标识 |
type | 文档类别 | Table | 索引内部的逻辑分类,可以对应为Mysql中的表,ES 6.x 版本中,一个索引只允许一个type,不再支持多个type。7.x版本中,type将废弃。 |
document | 文档 | Row | 构成索引的最小单元,属于一个索引的某个类别,从属关系为: Index -> Type -> Document,通过id 在Type 内唯一标识 |
field | 字段 | Column | 构成文档的单元 |
mapping | 索引映射(约束) | Schema | 用来约束文档字段的类型,可以理解为索引内部结构 |
shard | 分片 | 将索引分为多个块,每块叫做一个分片。索引定义时需要指定分片数且不能更改,默认一个索引有5个分片,每个分片都是一个功能完整的Index,分片带来规模上(数据水平切分)和性能上(并行执行)的提升,是ES数据存储的最小单位 | |
replicas | 分片的备份 | 每个分片默认一个备份分片,它可以提升节点的可用性,同时能够提升搜索时的并发性能(搜索可以在全部分片上并行执行) |
一个ES集群的结构如下:
每个节点默认有5个分片,每个分片有一个备分片。
6.x版本之前的索引的内部结构:
说明:ES 6.x 版本中,相同索引只允许一个type,不再支持多个type。7.x版本中,type将废弃。
所以,6.x版本的索引结构如下:
7.x版本的索引结构如下:
即通过一个文档,来创建索引。
启动ES实例后,发送如下请求:
curl -X PUT 'localhost:9200/index_name/type_name/1' -H 'Content-Type: application/json' -d '
{
"title": "我是文件标题,可被搜索到",
"text": "文本内容,ES时如何索引一个文档的",
"date": "2019/01/01"
}'
其中:
enum OpType {
/**
* Index the source. If there an existing document with the id, it will
* be replaced.
*/
INDEX(0),
/**
* Creates the resource. Simply adds it to the index, if there is an existing
* document with the id, then it won't be removed.
*/
CREATE(1),
/** Updates a document */
UPDATE(2),
/** Deletes a document */
DELETE(3);
...
}
0 = "parent"
1 = "pretty"
2 = "version\_type"
3 = "format"
4 = "index"
5 = "refresh"
6 = "error\_trace"
7 = "type"
8 = "timeout"
9 = "pipeline"
10 = "routing"
11 = "if\_seq\_no"
12 = "if\_primary\_term"
13 = "wait\_for\_active\_shards"
14 = "id"
15 = "op\_type"
16 = "human"
17 = "filter\_path"
indices:data/write/index
if (opType() != OpType.INDEX && id == null) {
addValidationError("an id is required for a " + opType() + "operation", validationException);
}
Transport将request封装成Task,将请求发送给服务端
elasticsearch.yml
中的auto_create_index
控制,true表示当插入的索引不存在时,自动创建该索引原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。