使用脚本对文档进行部分更新,并添加缺失的字段。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用脚本对文档进行部分更新,并添加缺失的字段。相关的知识,希望对你有一定的参考价值。

我想知道是否可以使用部分文档更新文档,并使用脚本执行另一个操作,例如,如果我添加data1,然后添加data2,我希望我的文档看起来像final_result。我希望所有的东西都被替换和添加,除了标签字段。

data1 = "name" : "myname", "code" : 123, "tag" : "first"

data2 = "name" : "myname", "code" : 555, "tag" : "second", "age":"50", "children": "3"

final_result = "name" : "myname", "code" : 555, "tag" : ["first","second"], "age":"50", "children": "3"

我可以使用这个脚本添加标签字段,但我不知道如何同时添加缺失的字段,我也不知道哪些字段可能会被高级添加。

POST myindex/_update/1


      "script" : 
        "source": "if(! ctx._source.tag.contains(params.tag))if (ctx._source.tag instanceof List)  ctx._source.tag.add(params.tag)  else  ctx._source.tag = [ctx._source.tag, params.tag] ",
        "lang": "painless",
        "params" : 
            "tag" : "sec"
        
    


我真的很感激,如果有人能给我一个例子,如何在python中做到这一点。

答案

你只需要为字段设置新的值就可以了。

POST myindex/_update/1

  "script": 
    "source": """
    if(!ctx._source.tag.contains(params.tag))
        if (ctx._source.tag instanceof List)  
          ctx._source.tag.add(params.tag) 

         else  
          ctx._source.tag = [ctx._source.tag, params.tag] 
        
    
    ctx._source.code = params.code
        """,
    "lang": "painless",
    "params": 
      "tag": "sec",
      "code": "555"
    
  

在Python上也是这样,创建Elasticsearch实例并调用update_by_query API

es = Elasticsearch(['https://user:secret@localhost:443'])

或者...

es = Elasticsearch(
    ['localhost', 'otherhost'],
    http_auth=('user', 'secret'),
    scheme="https",
    port=443,
)

然后... 主体就是你的剧本

self.es.update_by_query(index = indexName, body = q)

以上是关于使用脚本对文档进行部分更新,并添加缺失的字段。的主要内容,如果未能解决你的问题,请参考以下文章

反应状态缺失

rethinkdb - hasFields 查找具有多个多个缺失条件的所有文档

SQL,BigQuery - 用行的其他部分完成缺失值

python使用箱图法和业务规则进行异常数据处理并检查预测使用的数据特征是否有字段缺失的情况并补齐

pandas使用interpolate函数并设置method参数使用不同的插值算法对缺失值进行填充

GATK 模块 CombineVariants 合并多样本 VCF 时 AD 字段缺失问题