ElasticSearch基础:文档CRUD

来自Wikioe
跳到导航 跳到搜索


关于

Elasticsearch 是面向文档的存储引擎,存储的数据是以JSON文档为基本单位进行的,所以需要关注其对 ES 中文档的 CRUD 操作。

什么是文档

在 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号"
	}
}

文档元数据

文档元数据,指的是插入 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号"
    }
  }
}

文档的CRUD

插入

在 Elasticsearch 插入一个 JSON 文档,又叫索引文档,其实就是创建索引的过程。

  • (索引文档,是个动词,区别于文档的索引名)

语法:

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

其中:

  • PUT 代表发送一个 http put 请求,后面的URL参数说明:
    • {index}:索引名
    • {type}:文档类型名
      • (新版的 Elasticsearch 为了兼容老版本,只允许指定一个类型,随便设置一个类型名即可)。
    • {id}:文档的唯一 id
      • 可以不指定,如果不指定 id,需要使用 POST 发送请求。


示例:插入一条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号"
	}
}

查询

根据文档 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号"
    }
  }
}

更新

更新整个文档

与“索引文档”(插入文档)的语法一样,只要 ID 相同就会直接覆盖之前的文档。

更新文档局部

即:仅更新 json 文档的某些字段。

  • ES 底层文档是不可变的,所以每次修改文档,本质上是创建一个新的文档,然后把老的文档标记成删除


语法:

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


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

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

删除

语法:

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


示例:

DELETE /order/_doc/1