前言
本次记录仅自己学习所用,只针对性的记录。
ES版本
6.5
官网
基本概念
Near Realtime(NRT)
Elasticsearch(以下简称“ES”或“es”)接近实时的搜索平台。 这意味着es在发起检索到结果返回会有一个轻微的延迟(通常1秒。
Cluster(集群)
略,官网介绍
Node(节点)
略,官网介绍
Index(索引)
Index和mongo中collection有点类似,是document(文档)的集合,例如:你可以将customer归档为一个索引,product也归档为一个索引,order归档为一个索引,在单个集群中根据自己需要可以定义多个index。
注意: Index只能有小写字母组成,且该名称将用于document的index、搜索、更新、删除等操作。
Type(类型)
用于索引的逻辑类别/分区的类型,允许您在同一索引中存储不同类型的文档,例如,一个用于user的类型,另一个用于blog的类型。注意:在6.0.0版本后只能创建一个type,查看 移除原因 。
Document(文档)
document是可以被indexed的最基本单元,例如:一个customer文档,一个product文档,一个order文档,这些文档信息均为JSON格式化信息存储,在{Index}/{Type}中,你可以存储多个document,一个文档必须被声明在一个index的对应type中,即创建document必须要有index和type。
Shards&Replicas
略,官网介绍
安装
略,官网介绍
索引
查看索引
GET /_cat/indices?v
结果如下
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open school CtkMJ7tZQk2XDmfOxVgXqQ 5 1 0 0 460b 460b
green open .kibana_1 w4ymzF7YQtukLFsS33Ri2Q 1 0 4 0 18.5kb 18.5kb
yellow open immiker kWTcZHE-QS6rjR1BavOVhw 5 1 10 0 67kb 67kb
在以上结果中有一栏index,可以清晰查看到当前school、.kibana_1、immiker 3个index,其中.kibana_1为系统创建好的,关于其他栏(health、uuid等)详细介绍见官网介绍
创建索引
PUT /{Index}?pretty
{Index}为指定索引名称,参数pretty是将请求结果格式化json输出,非必填。例如:我们需要创建一个order索引,执行语句如下:
PUT /order?pretty
我们用 GET /_cat/indices?v
可以查看一下索引,得到结果如下:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open .kibana_1 w4ymzF7YQtukLFsS33Ri2Q 1 0 4 0 18.5kb 18.5kb
yellow open order qoLOxVTyRsmCxJRI3K4zYg 5 1 0 0 1.1kb 1.1kb
yellow open immiker kWTcZHE-QS6rjR1BavOVhw 5 1 10 0 67kb 67kb
yellow open school CtkMJ7tZQk2XDmfOxVgXqQ 5 1 0 0 1.2kb 1.2kb
删除索引
DELETE /{Index}
例如删除order索引,DELETE /order
即可删除订单索引,执行结果如下:
{
"acknowledged" : true
}
Document
创建/替换文档
PUT /{Index}/{Type}/{Id}
创建文档需要指定Index、Type、Id(可选)及具体内容,如在school索引下创建一个type为student的Id为20110001的学生信息,如果Index或Type不存在,将自动创建。
PUT /school/student/20110001
{
"name": "郭亦云",
"studentNo": 20110001,
"age": 19,
"from": "北京",
"gender": 1,
"profissional": "计算机科学与技术",
"grade": 2011,
"class": "计科(1)班"
}
返回结果如下:
{
"_index" : "school",// 所在索引名称
"_type" : "student",// 所在type
"_id" : "20110001",// 指定id
"_version" : 1,// 版本号
"result" : "created",// 创建/更新结果,第一次创建为created
"_shards" : {
"total" : 2,
"successful" : 1,// 成功数
"failed" : 0// 失败数
},
"_seq_no" : 0,
"_primary_term" : 1
}
注意:如果再次执行PUT /school/student/20110001
原有信息(所有字段会被更新为最新documwnt)将被覆盖更新,其返回结果:
{
"_index" : "school",
"_type" : "student",
"_id" : "20110001",
"_version" : 2,// 版本号+1
"result" : "updated",// 由原来的created变成updated
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1
}
如果我们不指定Id,仅仅将数据存储到Index/Type下会结果会怎样?我们向/school/student中存储一个学生信息,即POST /school/student
,学生信息如下:
{
"name": "城一嘉",
"studentNo": 20110002,
"age": 19,
"from": "上海",
"gender": 1,
"profissional": "计算机科学与技术",
"grade": 2011,
"class": "计科(1)班"
}
其会自动生成一个id(自然id),返回结果为:
{
"_index" : "school",
"_type" : "student",
"_id" : "f3QWl2cBCkI2QzPFaO5N",// 自然id
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
总结:执行PUT /{Index}/{Type}/{Id}
如果document不存在,则创建,否则替换原来document,如果不指定document的id的话,在进行存储时,会自动产生一个自然id
查看指定id的document
GET /{Index}/{Type}/{Id}
通过GET /{Index}/{Type}/{Id}
获取指定内容,切记,无需请求体(GET还能带请求体?自行百度),其结果如下:
{
"_index" : "school",
"_type" : "student",
"_id" : "20110001",
"_version" : 3,
"found" : true,// 找到与否
"_source" : {
"name" : "郭亦云",
"studentNo" : 20110001,
"age" : 19,
"from" : "北京",
"gender" : 1,
"profissional" : "计算机科学与技术",
"grade" : 2011,
"class" : "计科(1)班"
}
}
更新document
POST {Index}/{Type}/{Id}/_update
{
"doc"{
...// 待更新字段信息
}
}
例如,将id为20110001的学生姓名更改为 景清霁,年龄更改为20
POST /school/student/20110001/_update
{
"doc": {
"name":"景清霁",
"age":20
}
}
执行结果如下:
{
"_index" : "school",
"_type" : "student",
"_id" : "20110001",
"_version" : 4,
"result" : "updated",// 已更新
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 3,
"_primary_term" : 1
}
另外还有一种更新方式,如:将年龄更新为25
{
"script": "ctx._source.age=25"
}
条件更新document
通常我们会像sql一样来更新指定一类数据中的信息,例如将学号为20110001的学生年龄更改为20,或者将年级为2011级的学生均修改为2012级,那么该如果操作了呢?
POST {Index}/{Type}/_update_by_query
例如将年级为2011级的学生均修改为2012级,年龄修改为20:
{
"query":{// 条件匹配
"match":{
"grade":2011
}
},
"script":"ctx._source.grade=2012;ctx._source.age=20"// 信息修改,多个字段以英文;隔开
}
删除document
DELETE {Index}/{Type}/{Id}
例如删除id为20110001的document
DELETE /school/student/20110001
执行结果:
{
"_index" : "school",
"_type" : "student",
"_id" : "20110001",
"_version" : 8,
"result" : "deleted",// 删除结果
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 7,
"_primary_term" : 1
}
条件删除document
POST {Index}/{Type}/_delete_by_query
例如,删除学号为20110001的学生信息
{
"query": {
"match": {
"studentNo": 20110001
}
}
}
执行结果:
{
"took" : 7,
"timed_out" : false,
"total" : 1,
"deleted" : 1,
"batches" : 1,
"version_conflicts" : 0,
"noops" : 0,
"retries" : {
"bulk" : 0,
"search" : 0
},
"throttled_millis" : 0,
"requests_per_second" : -1.0,
"throttled_until_millis" : 0,
"failures" : [ ]
}
总结
以上只是对index、type、document作一个快速介绍,如document的基本操作增、删、改、查,对于更复杂的操作,我们将在下一篇学习!感谢您的耐心阅读~