ElasticSearch-put-索引
2025-01-22 08:19:30    966 字   
This post is also available in English and alternative languages.

ElasticSearch版本:6.5.0(点击跳转官方文档)

“索引一份文档” 表示把一个文档存储到索引(名词)里,以便它可以被检索或查询。这很像SQL中的insert关键字,差别是,如果文档已经存在,新的文档回覆盖旧的文档。

使用put,向es中索引(创建)一个文档。

文档通过 _index 、 _type 、_id唯一确定,我们可以自己提供一个_id,也可以让es为我们生成


1. PUT

选择的索引叫做"demo",类型叫做"testData",自己选择的id是"123"

1
2
3
4
5
6
7
8
9
10
11
12
13
put /demo/testDate/1
{
"name":"cyx1",
"age":"22",
"address":"nanjing"
}

put /demo/testDate/2
{
"name":"cyx2",
"age":"23",
"address":"nanjing2"
}

响应报文

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"_index": "demo",
"_type": "testDate",
"_id": "2",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": true
}

响应报文指出请求的索引已经被成功创建,这个索引中包含了元数据以及一个新元素:_version。es中每个文档都有版本号,每当文档变化(包括删除)都会使_version增加。


2. POST

让es自动为我们生成_id。请求结构发生了变化,不再使用 PUT 方法,而是 POST 方法

1
2
3
4
5
6
post /demo/testDate/
{
"name":"cyx3",
"age":"24",
"address":"nanjing3"
}

响应报文

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"_index": "demo",
"_type": "testDate",
"_id": "AWwo2-6G-lkrji9etDrN",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": true
}

响应报文和上面的没有什么区别,只是_id变成了自动生成的值。


3. 创建一个新文档

当使用put方式创建文档时(自己ID),如何判断是创建了一个文档,还是不小心覆盖了老文档(不小心id重复)?最简单的方式是使用es自动生成唯一的id。


3.1. op_type 方式

使用自定义ID,配合 op_type 作为查询参数

op_type=create:在提交时指定create,表示若id不存在时创建,否则创建失败

先插入一条测试数据

1
2
3
4
PUT /testdata/data/11
{
"text":"1111asdasd"
}

再使用 op_type 参数,插入同样id的数据

1
2
3
4
PUT /testdata/data/11?op_type=create
{
"text":"poiuytrewq"
}

返回报文,报错提示,版本冲突、文档id已存在

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"error": {
"root_cause": [
{
"type": "version_conflict_engine_exception",
"reason": "[data][11]: version conflict, document already exists (current version [1])",
"index_uuid": "rnzu7m1yRxuL26acX0_GpA",
"shard": "4",
"index": "testdata"
}
],
"type": "version_conflict_engine_exception",
"reason": "[data][11]: version conflict, document already exists (current version [1])",
"index_uuid": "rnzu7m1yRxuL26acX0_GpA",
"shard": "4",
"index": "testdata"
},
"status": 409
}

插入新的数据

1
2
3
4
PUT /testdata/data/12?op_type=create
{
"text":"omjsufna"
}

返回报文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"_index" : "testdata",
"_type" : "data",
"_id" : "12",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 10,
"_primary_term" : 32
}

3.2. _create端点

op_type=create方式,还有一种表达方式,_create端点

插入一条上面的id一样的文档

1
2
3
4
PUT /testdata/data/12/_create
{
"text":"omjsufna"
}

返回报文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"error": {
"root_cause": [
{
"type": "version_conflict_engine_exception",
"reason": "[data][12]: version conflict, document already exists (current version [1])",
"index_uuid": "rnzu7m1yRxuL26acX0_GpA",
"shard": "1",
"index": "testdata"
}
],
"type": "version_conflict_engine_exception",
"reason": "[data][12]: version conflict, document already exists (current version [1])",
"index_uuid": "rnzu7m1yRxuL26acX0_GpA",
"shard": "1",
"index": "testdata"
},
"status": 409
}

4. Reference

  • 《ElasticSearch权威指南》