【问题标题】:Elastic Search Partial Update弹性搜索部分更新
【发布时间】:2016-01-07 22:56:01
【问题描述】:

我想做如下的部分更新。添加一些新字段,例如 Bytes_In 和 Bytes_Out。并且还运行脚本来更新使用脚本从其他字段派生的字段。

脚本 session-duration-script.groovy 位于 /config/scripts 路径下。

ctx._source.duration= (new Date().parse("yyyy-MM-dd HH:mm:ss.SSS",ctx._source.sessionTerminationDateTime.replace("T", " ").substring(0,23)).getTime() - new Date().parse("yyyy-MM-dd HH:mm:ss.SSS",ctx._source.eventConversionDateTime.replace("T", " ").substring(0,23)).getTime())


access/access-event-logs/session-summary/0a30fd59karabip1new.lab.fp.f5net.com/_update   
{
       "doc" : {
          "active" : false,
          "Bytes_In": "100",
          "Bytes_Out": "100",
          "sessionTerminationDateTime": "2015-10-30T02:50:39.237Z"
       },
       "script_fields": {
               "my_field": {
                   "script_file": "session-duration-script"
                 }
        }
    }

当我运行上面的更新查询时,我得到了这个错误

{
  "code": 400,
  "message": "status:400, body:{\"error\":{\"root_cause\":[{\"type\":\"action_request_validation_exception\",\"reason\":\"Validation Failed: 1: can't provide both script and doc;\"}],\"type\":\"action_request_validation_exception\",\"reason\":\"Validation Failed: 1: can't provide both script and doc;\"},\"status\":400}",
  "originalRequestBody": "{\"error\":{\"root_cause\":[{\"type\":\"action_request_validation_exception\",\"reason\":\"Validation Failed: 1: can't provide both script and doc;\"}],\"type\":\"action_request_validation_exception\",\"reason\":\"Validation Failed: 1: can't provide both script and doc;\"},\"status\":400}",
  "referer": "172.17.86.67",
  "restOperationId": 6555035,
  "kind": ":resterrorresponse"
}

请告诉我有办法实现这种更新。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    如错误所述,您不能同时使用docscript。我的建议是修改脚本以添加您想要的字段,并使用 params 映射传递这些字段的值。

    【讨论】:

      【解决方案2】:

      update 文档,您可以提供doc script。你也不能像这样使用script_fields

      把你的session-duration-script.groovy改成这个

      编辑:如果您想根据新的sessionTerminationDateTime 计算duration,请将第一行放在最后(感谢@Val)

      ctx._source.duration= (new Date().parse("yyyy-MM-dd HH:mm:ss.SSS",ctx._source.sessionTerminationDateTime.replace("T", " ").substring(0,23)).getTime() - new Date().parse("yyyy-MM-dd HH:mm:ss.SSS",ctx._source.eventConversionDateTime.replace("T", " ").substring(0,23)).getTime());
      ctx._source.active = active;
      ctx._source.Bytes_In = Bytes_In; 
      ctx._source.Bytes_Out = Bytes_Out;
      ctx._source.sessionTerminationDateTime = sessionTerminationDateTime;
      

      之后,您可以通过以下方式更新文档

      POST access-event-logs/session-summary/0a30fd59karabip1new.lab.fp.f5net.com/_update
      {
        "script": {
          "file": "session-duration-script",
          "params": {
            "active": false,
            "Bytes_In": "100",
            "Bytes_Out": "100",
            "sessionTerminationDateTime": "2015-10-30T02:50:39.237Z"
          }
        }
      }
      

      【讨论】:

      • 你可能需要在计算ctx._source.duration之前设置ctx._source.sessionTerminationDateTime变量之前,即将脚本的第五行移动到第一个位置,因为计算持续时间使用该值。
      • 感谢@Val,没有意识到duration 正在使用该特定字段,我将编辑答案
      猜你喜欢
      • 2016-11-22
      • 2015-06-10
      • 1970-01-01
      • 2017-03-25
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多