5.2、Elasticsearch集群入门 —— 文档管理


5.2.1、新建文档

5.2.2、获取文档

5.2.3、更新文档

5.2.4、查询更新

5.2.5、删除文档

5.2.6、查询删除

5.2.7、批量操作

5.2.8、版本控制

5.2.9、路由机制

-—————————————

5.2.1、新建文档

格式: index/type/id,如果不设置id,es会自动生成它

1
2
3
4
5
6
7
PUT blog/article/1
{
"id": 1,
"title": "Git简介",
"posttime": "2018-01-09",
"content": "Git是一款免费、开源的分布式版本控制系统"
}

1
2
3
4
5
6
7
POST blog/article
{
"id": 2,
"title": "Git简介",
"posttime": "2018-01-09",
"content": "Git是一款免费、开源的分布式版本控制系统"
}

5.2.2、获取文档

GET blog/article/1

如果找不到

可以通过HEAD命令查看一个文档是否存在

HEAD blog/article/2

获取多个,根据index和 type:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
GET blog/_mget
{
"docs" : [
{
"_type": "article",
"_id": "1"
},
{
"_type": "article",
"_id": "2"
}
]
}
GET _mget
{
"docs" : [
{
"_index": "blog",
"_type": "article",
"_id": "1"
},
{
"_index": "blog",
"_type": "article",
"_id": "2"
}
]
}

5.2.3、更新文档

文档被索引以后要修改,

1
2
3
4
5
PUT index1/type1/1
{
"counter": 1,
"tags": ["red"]
}

使用脚本更新:

1
2
3
4
5
6
7
8
9
10
POST index1/type1/1/_update
{
"script": {
"inline": "ctx._source.counter += params.count",
"lang": "painless",
"params": {
"count" : 4
}
}
}

5.2.4、条件查询更新

如果满足条件则更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
POST index1/_update_by_query
{
"script": {
"inline": "ctx._source.category = params.category",
"lang": "painless",
"params": {
"category": "git"
}
},
"query": {
"term": {
"title": "git"
}
}
}

如果title中包含git关键字,则增加一个 category

5.2.5、删除文档

基于指定id从 索引库 中删除一个文档

DELETE blog/article/osGC1WoB4sRau0FmmUYE

再去查询:

GET blog/article/osGC1WoB4sRau0FmmUYE

HEAD blog/article/osGC1WoB4sRau0FmmUYE

如果 索引文档时指定了路由,那么也可以根据路由参数删除

DELETE blog/article/2?routing=user123

如果参数不正确,会删除失败

5.2.6、根据条件查询删除

删除 title中包含关键字 hibernate的文档

1
2
3
4
5
6
POST blog/_delete_by_query
{
"query": {
"title": "hibernate"
}
}

删除一个type(csdn)下所有的文档

1
2
3
4
5
6
POST blog/csdn/_delete_by_query
{
"query": {
"match_all": {}
}
}

5.2.7、批量操作

执行 Bulk API 可以 执行 批量索引、批量删除、批量更新等操作

一个 Bulk API 允许 单一请求 实现多个文档的 create、index、update、delete

5.2.8、版本控制

Elasticsearch API进行文档更新 过程:

读取源文档 -> 对原文档更新 -> 重新索引整个文档

使用同个线程同时修改一个文档, 会发生冲突;

1、 悲观锁控制

同一时刻只有一个线程访问数据

2、 乐观锁控制

Elasticsearch是分布式系统,

需要确保旧版本不会覆盖新版本

Elasticsearch 使用 _version 自增, 确保所有更新有序进行

  • 内部版本控制: 每次版本号,相等 才能操作成功;
  • 外部版本控制:外部文档 比 内部文档 版本高 时才能更新成功;

5.2.9、路由机制

分片的路由机制:

shard = hash(routing)% number_of_primary_shards

routing 是一个任意字符串,取它的hash值,取模后 放在对应的 分片上;

hash值相同的 文档 放在 同一个主分片中;

默认路由模式可以保障 文档id数据平均分布,ES无法根据 id 确定 文档的位置,需要广播到所有分片上查找;

自定义路由模式,可以使查询具有目的性,不用盲目广播

1
2
3
4
5
PUT sinablog/user/1?routing=user123
{
"title": "hahaha ni mei",
"text": "asd adsf fds vs rew"
}

GET sinablog/_search?routing=user123