python使用elasticsearch批量追加更新,条件更新

使用 doc更新数据,原数据会被覆盖,如果要更新一个列表,追加而不是覆盖。那么doc就不符合这个业务场景了。
这时可以通过script脚本处理追加数据

更新前
python使用elasticsearch批量追加更新,条件更新_第1张图片

from elasticsearch import Elasticsearch
from elasticsearch.helpers import bulk

es = Elasticsearch("localhost:9200")
docs = [
	# 对字符串的追加更新
    {"_op_type": "update", "_index": "test_index1", "_type": "test_type", "_id": "001", "script": {"inline":"ctx._source.name+=params.tag","params":{"tag":"黄晓明"}}},
    # 对列表的追加更新
    {"_op_type": "update", "_index": "test_index1", "_type": "test_type", "_id": "002","script": {"inline":"ctx._source.names.add(params.tag)","params":{"tag":{"adc":"666"}}}}
]
# 批量更新
bulk(client=es, actions=docs, chunk_size=len(docs))

更新后
python使用elasticsearch批量追加更新,条件更新_第2张图片

注意:我之前使用的5.2.0版本没有script功能,试了半天都失败了差点怀疑人生。更换了5.6版本之后发现支持了script,具体什么原因没有深究

接下来是条件更新

update_doc = {
  "script": {
    "inline": "if(ctx._source.age==params.age && ctx._source.names!=null)
    {ctx._source.names.add(params.tag)}",
    "params": {"tag": {"adc": "634366"}, "age": 1000}
  }
}
es.update_by_query(index="test_index1", doc_type="test_type", body=update_doc)

这条语句的意思是,如果age为1000,并且names这个数组存在,则对数组进行追加更新。
因为如果names数组不存在,进行更新的话,会报错。

你可能感兴趣的:(ElasticSearch)