前面的章节主要介绍 ES 的基本概念,以及如何使用 ES+Kibana 进行业务数据的分析挖掘。本章节将涉及到如何使用 ES 对数据进行增删改查,传统数据库第一步就是创建数据库,然后创建表,再基于表对数据进行增删改查,ES 也是如此。前面也对传统数据库与 ES 做了简单的对比,数据库 == ES 实例,数据库表 == ES 索引,数据库 schema==mapping。
7.0 之前的 ES 是这么一种格式,索引/类型,如果把索引看做是数据库,那么类型就是数据库表,你可以这么定义 class/student/1,表示班级索引、学生类型、学号为 1。现在 7.0 之后类型统一为 _doc。
![](https://img.haomeiwen.com/i1940331/6f68776acd3fa14b.png)
Index 操作
我们现在创建一个班级索引,并插入一条学生的数据。值得注意的是我框选出来的,首先是 type 我改成 _doc,否则将无法创建索引。其次是 id 号为 1,版本号 _version 也是 1,result 是 created。如果我再执行一次这个命令:
![](https://img.haomeiwen.com/i1940331/9fd57ae83c67d900.png)
是的,版本号加 1,另外显示 result 为 updated。也就是说,在使用 PUT 作为创建索引添加数据的时候,会检查是否存在相同的文档,如果存在则删除,并且创建新的文档,另外版本号加一。
![](https://img.haomeiwen.com/i1940331/f0d679664b455d08.png)
我想要像传统数据库那样,指定 id 为主键后,再插入数据如果有相同的 id 则无法插入,明显 index 操作无法满足这种需求。
Create 操作
PUT 提供了另外一个 REST
API 来解决这个问题——create。直接执行将会报错,像下图那样。如果想要创建唯一个文档,可以考虑使用 create 命令。
PUT class/_create/1
{
"name":"xiaoming",
"sex":"man",
"age":16
}
![](https://img.haomeiwen.com/i1940331/c26b4ff81cc0cebf.png)
在传统数据库中,可以设置自增的 id,在 ES 中虽然不能够设置自增 id,但是可以设置自动生成 id,只需要使用 POST 接口。虽然没有指定 id,但是系统自动生成了唯一的 id。像 ES 中存数据,要有个顺序,首先是指定索引,索引指定后指定 Type,然后才是 id,id 不指定也行,但是要使用 POST 接口(Index->Type->id)。
POST class/_doc
{
"name":"xiaohong",
"sex":"female",
"age":16
}
![](https://img.haomeiwen.com/i1940331/1ef7804a09da1b6f.png)
当我们创建好一个文档后,返回的数据如下,从返回的数据可以了解到,索引 _index 是 class,类型 _type 是 _doc,_id 是 DqksZm8BOMhQf7h0chZh
。另外,可以看到分片信息,一共有两个主分片。
{
"_index" : "class",
"_type" : "_doc",
"_id" : "DqksZm8BOMhQf7h0chZh",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 3,
"_primary_term" : 3
}
我们在创建 calss 的时候,虽然没有配置分片信息,但是已经系统给定默认的配置,我们也可以自定义配置方法。我配置了 2 个主分片,并为每个分片配置一个副本。
PUT /class1
{
"settings": {
"number_of_replicas": 1,
"number_of_shards": 2
}
}
![](https://img.haomeiwen.com/i1940331/85a6b2dcf44e7a7d.png)
我在索引 class1 中创建一个文档,可以看到分片信息。
![](https://img.haomeiwen.com/i1940331/217cba37ec28331f.png)
网友评论