Elasticsearch入门-4.文档

1. 什么是文档

通常情况下,文档 就是我们所说的 对象 ,但是 对象 有时会有嵌套的情况,而 文档 则指的是最顶层的根对象。

2. 文档元数据

Es包含如下常见元数据

名称 含义 备注
_index 文档在哪个索引存放
_type 文档表示的对象类别
_id 文档唯一标识

3. 索引文档

索引文档的方法前面已经提到过,这里主要是介绍自定义ID

3.1 自定义ID

如果文档带有ID,就可以自定义使用该ID,否则ES会自动生成ID

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//自定义ID
PUT /aviraer/user/10
{
"name": "jack",
"age":87,
"gender": "male"
}

//ES生成ID
POST /aviraer/user/
{
"name": "tony",
"age":87,
"gender": "male"
}

4. 取回文档

4.1 取回文档

1
GET /aviraer/user/10

4.2 取回文档的一部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//仅取回name和age字段
GET /aviraer/user/10?_source=name,age
{
"_index": "aviraer",
"_type": "user",
"_id": "10",
"_version": 2,
"found": true,
"_source": {
"name": "jack",
"age": 87
}
}

//仅取回数据,不取任何元数据
GET /aviraer/user/10/_source
{
"name": "jack",
"age": 87,
"gender": "male"
}

5. 文档是否存在

1
GET /aviraer/user/10 //根据响应的HTTP状态码是否为404判断资源是否存在

6. 更新整个文档

更新整个文档后_version字段会自动增加1,旧版本的文档不会立即消失,es会在后台清理这些文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
PUT /aviraer/user/10
{
"name": "jack",
"age":27,
"gender": "male"
}

{
"_index": "aviraer",
"_type": "user",
"_id": "10",
"_version": 3,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 3,
"_primary_term": 4
}

7. 创建新文档

如果只是希望创建新文档,又想避免因ID重复导致旧文档被覆盖就可以使用_create参数

1
2
3
4
5
6
PUT /aviraer/user/10/_create
{
"name": "jack",
"age":27,
"gender": "male"
}

此时尝试覆盖会返回409错误。

8. 删除文档

1
DELETE /aviraer/user/10

如果文档不存在则会返回404,即使文档不存在version字段也会增加,用来保证跨界点以正确的顺序执行

9. 乐观并发控制

ES提供基于版本号的并发控制,可以在更新请求参数加上版本号来使用,如果请求版本不是当前最新版本则

返回409。

1
2
3
4
5
PUT /aviraer/user/10?version=1
"name": "jack",
"age":27,
"gender": "male"
}

另外ES支持外部版本号,而对应的规则也变更为:更新请求的版本号必须大于当前版本号,否则会返回409。

10. 文档部分更新

前面提到的文档更新方式是覆盖更新,如果只想更新部分文档就可以使用_update

1
2
3
4
5
6
POST /aviraer/user/10/_update
{
"doc" : {
"age" : 11
}
}

11. 文档批量获取

可以使用_mget来进行批量文档获取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST /_mget
{
"docs" : [
{
"_index" : "scs_test",
"_type" : "question",
"_id" : 1
},
{
"_index" : "scs_test",
"_type" : "question",
"_id" : 2
}
]
}

12. 文档批量操作

使用 bulk 可以在单个步骤中进行多次 createindexupdatedelete 请求 ,请求格式如下:

1
2
3
4
5
6
{ action: { metadata }}\n
{ request body }\n
{ action: { metadata }}\n
{ request body }\n
...
//最后一行\n必须保留

操作示例

1
2
3
4
POST /scs_test/question/_bulk
{ "delete": { "_id": "1" } }
{ "create": { "_id": "2" } }
{"content": "问题2"}

一般情况下批量大小1000-5000个左右开始测试,数量超过一定量性能不会提升甚至下降

为什么使用换行而不使用一个大JSON数组来表示这些信息呢? 使用换行可以使得ES直接从网络缓冲区读取一条数据后直接转发到对应Node,减少内存占用