文章目录
Elastic Search数据格式
- 传统:应用系统的数据结构都是面向对象的,将数据对象存储到数据库,查询的时候将关联的对象再聚合起来。
- ES:Elastic Search面向文档,文档中存储和传统数据库一样的对象。
例如学生和班级的关系:
public class Student {
private String id;
private String name;
private String classId;
}
private class Classes {
private String id;
private String className;
}
传统的数据库中要设计所谓的一对多,多对一的两张表,添加外键等。查询时需要进行关联,过程繁琐。
ES规避了这种繁琐的设计,直接将学生存储为一个文档:
{
"id":"1",
"first_name": "san",
"last_name": "zhang",
"classInfo": {
"id": "1",
"className": "三年二班"
}
}
Elastic Search的CURD操作
创建索引
语法:PUT /index
删除索引
语法:DELETE /index
增加文档
语法:PUT /index/type/id
查询文档
语法:GET /index/type/id
修改文档
- 全文替换
全文替换是将文档的所有信息进行覆盖,需要填写所有的字段。
语法:PUT /index/type/id
- 局部替换
局部替换只会替换当前需要替换的字段。
语法:POST /index/_update/id
在doc
中传入想要修改的字段。
删除文档
语法:DELETE /index/type/id
自动生成id
在创建的时候,我们可以选择手动创建id,也可以不传入id,这是ES会自动生成id。
ES提供生成20位base64编码的GUID,通过算法使得id不会重复,即使是在分布式的情况下。
语法:POST /index/type/
自定义返回数据
有些时候数据过于多,但是只需要返回所需的字段,可以自定义获取目标字段。
语法:GET /index/type/id?_source_includes=字段1,字段2……
强制创建
全局更新可以理解为再次创建了新的文档,因为传入了全部字段。仔细回看全局更新会发现,在更新的时候version
字段会进行累加,这是因为更新的时候创建了新的文档,旧文档并没有删除,而是标记为deleted
状态,等到合适的时间ES会进行批处理统一删除。
为防止覆盖原有数据,ES提供了强制创建,这样不会覆盖原有文档。
语法:PUT /index/type/id/_create
脚本更新
ES支持使用内置脚本执行复杂操作。
例如:将id为1的学生age
增加为10岁。
POST /stu/class1/1/_update
{
//ctx表示当前内容 当查询的时候数据都是保存在_source中的
"script" : "ctx._source.age += 10"
}
此时的年纪由创建的18岁变为了28岁(一下子变老咯~)。
更多关于脚本的内容可以参考官网:elastic官网脚本文档,这里不做过多的赘述。
_version乐观锁控制
对于ES,文档的增删改都是基于版本号_version
。
上述的例子已经证明改是版本号增加,对于增和删这里就不做演示了。
为什么会采用这种所谓的延时策略?这是因为对于ES来说,每当有数据需要删除的时候,如果立刻进行删除,所有分片和副本也都需要立刻进行删除,这对于ES集群来说压力太大,因此ES采用这种方法来减缓压力,待到合适时机统一进行删除。