笔记来源 → B站学习视频:最新ElasticSearch6实战教程。
序号是视频序号,内容根据我的理解微调了。
上篇介绍了es的一点基础,以及简单创建index、type和添加数据的方法。
本篇内容:(1)修改数据(基于脚本);(2)object类型;(3)使用post、put对文档修改的区别;(4)解析上篇中的metadata元数据;(5)_source元数据解析。
目录
30. 基于groovy脚本执行部分更新
以下是按照视频的顺序介绍的。
① 修改参数单值:这里我修改了id 为1的doc中的age,结果为age值加一。
GET /mauanx/user/1/_update
{
"script":"ctx._source.age+=1"
}
② 数组中增删改数据
1)增:在interests数组中增加"football"。
GET /mauanx/user/1/_update
{
"script":{
"source":"ctx._source.interests.add(params.tag)",
"params":{
"tag":"football"
}
}
}
2)删:删除interests数组中的"football"。
GET /mauanx/user/1/_update
{
"script":{
"source":"ctx._source.interests.remove(ctx._source.interests.indexOf(params.tag))",
"params":{
"tag":"football"
}
}
}
③ 删除文档
GET /mauanx/user/1/_update
{
"script":{
// 三元运算符,满足则删除,否则无操作
"source":"ctx.op=_source.age==params.count?'delete':'none'",
"params":{
"count":22
}
}
}
④ 修改/创建一个doc
GET /mauanx/user/1/_update
{
"script":"script":"ctx._source.age+=1"
// "upsert":当文档存在时,执行"script"中的操作;若不存在,则使用"upsert"中的数据初始化doc。
"upsert":{
"name":"Abbey",
"age":20,
"sex":"female",
"interests":["music"]
}
}
15. Object数据类型及手动创建。
除了基础类型外,es还可以创建object。
(1)自动创建
doc字段为:name(text),infos(object,object中只有一个age)。我们存储了两个doc。
① 存储格式:
{
"name":"Abbey",
"infos":{
"age":20
}
}
{
"name":"Barbara",
"infos":{
"age":22
}
}
② 底层存储格式
{
"name":["Abbey","Barbie"],
"infos.age":[20,22]
}
2)手动创建:
PUT /index
{
"settings":{
"属性":属性值
},
"mappings":{
"属性":{
"properties":{
"属性":属性值
}
}
}
}
29. 文档修改原理
(1)使用put修改文档(全部替换):es查询出数据展示给用户,用户修改后提交数据,旧文档被标记为deleted document,创建新文档new doc。旧文档在后续会被es删除。
(2)使用post修改文档(部分替换):用户直接提交需要修改的数据,es修改数据,旧文档被标记为deleted document,创建新文档new doc。旧文档在后续会被es删除。
总结:
① post比put需要的网络传输次数要少,从而提高了性能。post的查询文档到修改都是在es内部实现的。
② 并发时,post比put发生冲突的可能性更小。
26.27. metadata元数据解析
(1)_index:
① 指明文档存放在哪个索引中。
② 同一个索引下应当存放相似的文档(文档的field多数相同)。举例:若同一index中存放了前台系统、后台系统需要的数据类型,则当前台、后台同时搜索时,会影响搜索的性能。
③ 索引名:必须小写;不能以下划线开头;不能有逗号。
(2) _type:
① 指明文档属于索引中哪个类型。
② 一个索引下只能有一个type。
③ 类型名:可以大小写;不能以下划线开头;不能有逗号。
(3)_id:
① 指定文档的唯一标识。
② id的生成:
1)使用 PUT /index/type/id 自己指定,通常在数据导入es时使用。
2)使用 POST /index/type 自动生成。es使用了GUID算法,并发添加时id不会重复。
28. _source元数据解析
使用GET /index/type/id 查询时,"_source"下是查询出的字段,以及存储的数值。默认返回所有字段的数值。
也可以选择返回的参数:
// ① 选取参数"age"
GET /mauanx/user/1?_source=age
// ② 选取参数"age"和"name"
GET /mauanx/user/_search
{
"_source": {
"includes":["age","name"]
}
}