最近一直在研究怎么对es 数据库进行追加更新,因为无论是整个文档更新还是局部的更新,都是先找到旧的,然后标记删除,然后再添加新的文档,显然这不能满足需要对文档追加更新的需求,即不覆盖之前的记录进行更新。以下分情况进行研究:
- 对列表的追加更新
不管是对列表还是对字符串的追加更新,都需要利用脚本来进行,script比较灵活可以自己定义你想实现的逻辑,如下,首先判断文档中有没有vuln_label这个字段(filed),没有的话添加一个这个字段,数据结构定为列表,如果有这个字段则追加更新params.tag
body = {
"script": {
"lang": "painless",
"source": "if(ctx._source.vuln_label==null){ctx._source.vuln_label=[];ctx._source.vuln_label.add(params.tag)}"
"params": {
"tag":{
"CVE_ID": item['CVE_ID'],
"creates_time": item['created_time'],
"risk_level": item['risk_level'],
"Description": item['Description'],
"vulnerable_type": item['vulnerable_type']
}
}
}
}
- 对字符串的追加更新
对字符串的追加更新更新和列表类似:
body={"script": {"source":"ctx._source.name+=params.tag","params":{"tag":"黄晓明"}}}
- 对字典的追加更新(这种情况建议新增一个字段),例如情况1
注意**:用source而不是inline,使用inline会有警告!**
|