“ElasticSearch基础:文档CRUD”的版本间差异
跳到导航
跳到搜索
(建立内容为“category:ElasticSearch == 关于 == <syntaxhighlight lang="java" highlight=""> </syntaxhighlight>”的新页面) |
小无编辑摘要 |
||
(未显示同一用户的1个中间版本) | |||
第1行: | 第1行: | ||
[[category: | [[category:ElasticSearch教程]] | ||
== 关于 == | == 关于 == | ||
Elasticsearch 是'''面向文档的存储引擎''',存储的数据是以'''JSON'''文档为基本单位进行的,所以需要关注其对 ES 中文档的 CRUD 操作。 | |||
=== 什么是文档 === | |||
在 Elasticsearch 中,文档其实就是一条 JSON 数据。 | |||
JSON 数据格式可以非常复杂,也可以很简单。 | |||
JSON 文档的例子: | |||
<syntaxhighlight lang="JSON" highlight=""> | |||
{ | |||
"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号" | |||
} | |||
} | |||
</syntaxhighlight> | |||
=== '''文档元数据''' === | |||
文档元数据,指的是插入 JSON 文档的时候,Elasticsearch 为这条数据'''自动生成的系统字段'''。 | |||
* '''元数据的字段名都是以下划线开头的'''。 | |||
常见的元数据如下: | |||
* '''_index''':代表当前 JSON 文档所属的文档名字。 | |||
* '''_type''':代表当前 JSON 文档所属的类型。 | |||
** 虽然新版 ES 废弃了 type 的用法,但是元数据还是可以看到。 | |||
* '''_id''':文档唯一Id。 | |||
** 如果我们没有为文档指定 id,系统会自动生成。 | |||
* '''_source''':代表我们插入进去的 JSON 数据。 | |||
* '''_version''':文档的版本号。 | |||
** 每修改一次文档数据,字段就会加 1。 | |||
** 新版 ES 已不再使用。 | |||
* '''_seq_no''':文档的'''版本号'''(替代 _version 字段)。 | |||
* '''_primary_term''':文档所在'''主分区''',这个可以跟 _seq_no 字段搭配实现'''乐观锁'''。 | |||
示例:从ES查询出来的一条文档 | |||
<syntaxhighlight lang="JSON" highlight=""> | |||
{ | |||
"_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号" | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
== 文档的CRUD == | |||
=== 插入 === | |||
在 Elasticsearch 插入一个 JSON 文档,又叫'''索引文档''',其实就是创建索引的过程。 | |||
* (索引文档,是个动词,区别于文档的索引名) | |||
语法: | |||
<syntaxhighlight lang="java" highlight=""> | |||
PUT /{index}/{type}/{id} | |||
{ | |||
"field": "value", | |||
... | |||
} | |||
</syntaxhighlight> | |||
其中: | |||
* PUT 代表发送一个 http put 请求,后面的URL参数说明: | |||
** {index}:索引名 | |||
** {type}:文档类型名 | |||
***(新版的 Elasticsearch 为了兼容老版本,只允许指定一个类型,随便设置一个类型名即可)。 | |||
** {id}:文档的唯一 id | |||
*** 可以不指定,如果不指定 id,需要使用 '''POST''' 发送请求。 | |||
示例:插入一条JSON数据,到order索引中,文档类型是_doc, 文档id是1 | |||
<syntaxhighlight lang="java" highlight=""> | |||
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号" | |||
} | |||
} | |||
</syntaxhighlight> | |||
=== 查询 === | |||
根据文档 ID 查询一个文档。 | |||
语法: | |||
<syntaxhighlight lang="java" highlight=""> | <syntaxhighlight lang="java" highlight=""> | ||
GET /{index}/{type}/{id} | |||
</syntaxhighlight> | |||
示例: | |||
<syntaxhighlight lang="java" highlight=""> | |||
GET /order/_doc/1 | |||
</syntaxhighlight> | |||
返回: | |||
<syntaxhighlight lang="java" highlight=""> | |||
{ | |||
"_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号" | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
=== 更新 === | |||
==== 更新整个文档 ==== | |||
与“索引文档”(插入文档)的语法一样,只要 ID 相同就会直接覆盖之前的文档。 | |||
==== 更新文档局部 ==== | |||
即:仅更新 json 文档的某些字段。 | |||
* ES '''底层文档是不可变的''',所以每次修改文档,本质上是'''创建一个新的文档,然后把老的文档标记成删除'''。 | |||
语法: | |||
<syntaxhighlight lang="java" highlight=""> | |||
POST /{index}/_update/{id} | |||
{ | |||
"doc":{ // 在doc字段中指定需要更新的字段 | |||
// 需要更新的字段列表 | |||
} | |||
} | |||
</syntaxhighlight> | |||
示例:更新order索引中,文档id等于1的json文档,更新status和total_price两个字段 | |||
<syntaxhighlight lang="java" highlight=""> | |||
POST /order/_update/1 | |||
{ | |||
"doc":{ | |||
"status":3, | |||
"total_price":200 | |||
} | |||
} | |||
</syntaxhighlight> | |||
=== 删除 === | |||
语法: | |||
<syntaxhighlight lang="java" highlight=""> | |||
DELETE /{index}/{type}/{id} | |||
</syntaxhighlight> | |||
示例: | |||
<syntaxhighlight lang="java" highlight=""> | |||
DELETE /order/_doc/1 | |||
</syntaxhighlight> | </syntaxhighlight> |
2023年3月31日 (五) 21:51的最新版本
关于
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