一架梯子,一头程序猿,仰望星空!

Elasticsearch 快速入门


前面介绍过Elasticsearch是面向文档的存储引擎,存储的数据是以JSON文档为基本单位进行的,本节主要介绍ES中文档的CRUD操作。

1.什么是文档

在Elasticsearch中,文档其实就是一条JSON数据。

JSON数据格式可以非常复杂,也可以很简单。

JSON文档的例子:

{
	"id": 12,
	"status": 1,
	"total_price": 100,
	"create_time": "2019-12-12 12:20:22",
	"user" : { // 嵌套json对象
		"id" : 11,
		"username": "tizi365",
		"phone": "13500001111",
		"address" : "上海长宁区001号"
	}
}

前面章节介绍过,在ES中索引类似MYSQL表的概念,索引包含多个文档数据。

提示: ES 索引不要求,同一个索引中的所有JSON文档的格式都一样,甚至可以在同一个索引中保存完全不一样格式的JSON数据,当然不推荐这么做,建议同一个索引仅保存格式相同的数据,例如:订单索引,仅保存订单数据,不要保存其他业务数据。

2.文档元数据

文档元数据,指的是插入JSON文档的时候,Elasticsearch为这条数据,自动生成的系统字段

元数据的字段名都是以下划线开头的。

常见的元数据如下:

  • _index - 代表当前JSON文档所属的文档名字
  • _type - 代表当前JSON文档所属的类型,虽然新版ES废弃了type的用法,但是元数据还是可以看到。
  • _id - 文档唯一Id, 如果我们没有为文档指定id,系统会自动生成
  • _source - 代表我们插入进去的JSON数据
  • _version - 文档的版本号,每修改一次文档数据,字段就会加1, 这个字段新版的ES已经不使用了
  • _seq_no - 文档的版本号, 替代老的_version字段
  • _primary_term - 文档所在主分区,这个可以跟_seq_no字段搭配实现乐观锁。

下面是从ES查询出来的一条文档的例子:

{
  "_index" : "order",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1, // 老ES版本的文档版本号,最新版本已经不使用了
  "_seq_no" : 0, // 新ES版本的文档版本号
  "_primary_term" : 1, // 主分区id
  "_source" : { // _source字段保存的就是我们插入到ES中的JSON数据
    "id" : 1,
    "status" : 1,
    "total_price" : 100,
    "create_time" : "2019-12-12 12:20:22",
    "user" : {
      "id" : 11,
      "username" : "tizi365",
      "phone" : "13500001111",
      "address" : "上海长宁区001号"
    }
  }
}

3.插入文档

在Elasticsearch插入一个JSON文档,又叫索引文档, 注意这里的索引跟前面提到的文档所属的索引名,不是一回事,很晕吧,其实主要翻译问题,我们将数据插入到ES的过程,其实就是创建索引的过程,所以插入文档,也叫做索引文档,这里索引是动词, 而文档属于哪个索引(index),这里的索引代表一个分类,有数据库的概念,是个名词。

搞不清楚也没关系,知道索引文档的意思,其实就是往ES插入数据就行。

插入文档的语法:

PUT /{index}/{type}/{id}
{
  "field": "value",
  ...
}

PUT代表发送一个http put请求, 后面的URL参数说明:

  • {index} - 索引名
  • {type} - 文档类型名 - 新版的Elasticsearch为了兼容老版本,只允许指定一个类型,随便设置一个类型名就行。
  • {id} - 文档的唯一id, 可以不指定, 如果不指定id, 需要使用POST发送请求

提示:教程的语法说明,没有给出ES的接口地址,如果你想通过curl命令,或者postman测试的话,只要加上ES接口地址即可,ES默认地址是http://localhost:9200/。

例子:

插入一条JSON数据,到order索引中,文档类型是_doc, 文档id是1

PUT /order/_doc/1
{
	"id": 1,
	"status": 1,
	"total_price": 100,
	"create_time": "2019-12-12 12:20:22",
	"user" : { 
		"id" : 11,
		"username": "tizi365",
		"phone": "13500001111",
		"address" : "上海长宁区001号"
	}
}

提示:将例子代码,直接贴到Kibana的console中,就可以执行, 在console页面右侧可以直接看到执行结果。

提示:ES支持动态映射,可以根据我们插入的JSON数据,自动推测出JSON字段的类型,所以我们不需要在ES中提前定义JSON的格式。

4.查询一个文档

根据文档ID查询一个文档。

语法:

GET /{index}/{type}/{id}

例子:

GET /order/_doc/1

返回:

{
  "_index" : "order",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "id" : 1,
    "status" : 1,
    "total_price" : 100,
    "create_time" : "2019-12-12 12:20:22",
    "user" : {
      "id" : 11,
      "username" : "tizi365",
      "phone" : "13500001111",
      "address" : "上海长宁区001号"
    }
  }
}

5.更新文档

5.1. 更新整个文档

更新整个文档语法跟前面介绍的插入文档的语法一模一样,只要ID相同就会直接覆盖之前的文档。

5.2. 文档局部更新

如果我们只想更新json文档的某些字段,可以使用局部更新

语法:

POST /{index}/_update/{id}
{
  "doc":{ // 在doc字段中指定需要更新的字段
    // 需要更新的字段列表
  }
}

例子:

更新order索引中,文档id等于1的json文档,更新status和total_price两个字段

POST /order/_update/1
{
  "doc":{
    "status":3,
    "total_price":200
  }
}

提示:虽然说elasticsearch支持通过Api更新文档,但是ES底层文档是不可变的,每次修改文档,本质上是创建一个新的文档,然后把老的文档标记成删除。

6.删除文档

删除语法:

DELETE /{index}/{type}/{id}

例子:

DELETE /order/_doc/1

说明:ES最强大的特性是搜索,本节没有介绍ES的文档搜索语法,后面的章节会单独介绍。