ElasticSearch从零到精通(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/QQ243223991/article/details/84943796

前言

本次记录仅自己学习所用,只针对性的记录。

ES版本

6.5

官网

https://www.elastic.co/

基本概念

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的基本操作增、删、改、查,对于更复杂的操作,我们将在下一篇学习!感谢您的耐心阅读~

猜你喜欢

转载自blog.csdn.net/QQ243223991/article/details/84943796