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 | PUT blog/article/1 |
1 | POST blog/article |
5.2.2、获取文档
GET blog/article/1
如果找不到
可以通过HEAD命令查看一个文档是否存在
HEAD blog/article/2
获取多个,根据index和 type:
1 | GET blog/_mget |
5.2.3、更新文档
文档被索引以后要修改,
1 | PUT index1/type1/1 |
使用脚本更新:
1 | POST index1/type1/1/_update |
5.2.4、条件查询更新
如果满足条件则更新
1 | POST index1/_update_by_query |
如果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 | POST blog/_delete_by_query |
删除一个type(csdn)下所有的文档
1 | POST blog/csdn/_delete_by_query |
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 | PUT sinablog/user/1?routing=user123 |
GET sinablog/_search?routing=user123