【问题标题】:Elasticsearch java HighLevel client update script with params带有参数的 Elasticsearch java HighLevel 客户端更新脚本
【发布时间】:2019-01-13 19:39:39
【问题描述】:

我想通过在我的用户列表中添加一个元素来进行部分更新:

"users" : [
            {
              "password" : "pwd",
              "level" : "admin",
              "user_name" : "XX",
              "last_name" : "YY",
              "first_name" : "ZZ"
            }
]

使用 Kibana 我已经尝试过这个请求:

POST my_index/user/1/_update
{
    "script" : {
        "source": "ctx._source.users.add(params.user)",
        "lang": "painless",
        "params" : {
          "user": {
            "user_name" : "user",
            "first_name" : "XX",
            "last_name" : "XX",
            "level" : "simple",
            "password" : "pwd!#"
          }
        }
    }
}

效果很好:

 "users" : [
                {
                  "password" : "pwd",
                  "level" : "admin",
                  "user_name" : "XX",
                  "last_name" : "YY",
                  "first_name" : "ZZ"
                },
               {
              "password" : "pwd!#",
              "level" : "simple",
              "user_name" : "user",
              "last_name" : "XX",
              "first_name" : "XX"
            }
    ]

我想用java客户端来做,我试过这个代码:

XContentBuilder builder = XContentFactory.jsonBuilder();
            builder.startObject();
            {
                 builder.field("user_name", user.getUserName());
                 builder.field("first_name", user.getFirstName());
                 builder.field("last_name", user.getLastName());
                 builder.field("level", user.getLevel());
                 builder.field("password", user.getPassword());
            }
            builder.endObject();
            params.put("user", Strings.toString(builder));

UpdateByQueryRequest setScript = request.setScript(
                new Script(
                    ScriptType.INLINE, "painless",
                    "ctx._source.users.add(params)",                    
                    params)); 
        request.setScroll(TimeValue.timeValueMinutes(10));

 BulkByScrollResponse bulkResponse = restHighLevelClient.updateByQuery(request, RequestOptions.DEFAULT);

结果,我有:

"users" : [
            {
              "password" : "pwd",
              "level" : "admin",
              "user_name" : "XX",
              "last_name" : "YY",
              "first_name" : "ZZ"
            },
            {
              "user" : """{"user_name":"XX","first_name":"XX","last_name":"XX","level":"XX","password":"XX"}""",
              "ctx" : {
                "_routing" : null,
                "_parent" : null,
                "_index" : "administration",
                "_type" : "environnement",
                "_id" : "1",
                "_version" : 24
              }
            }
          ]

所以这是不正确的,我只想将用户信息添加到用户,我不想索引 ctx 信息。

谢谢!

【问题讨论】:

标签: java elasticsearch


【解决方案1】:

有点晚了,但是……你的脚本中有一个错字,你添加了 params 而不是 params.user。

UpdateByQueryRequest setScript = request.setScript(
            new Script(
                ScriptType.INLINE, "painless",
                "ctx._source.users.add(params.user)",    <-- here                
                params)); 
    request.setScroll(TimeValue.timeValueMinutes(10));

无论如何,这可能无法解决它,我遇到过类似的问题,发现最简单的解决方案是将每个值作为参数传递并在脚本中创建一次对象,这将给出:

parameters.put("user_name", user.getUserName());
parameters.put("first_name", user.getFirstName());
parameters.put("last_name", user.getLastName());
parameters.put("level", user.getLevel());
parameters.put("password", user.getPassword());
request.setScript(new Script(
        ScriptType.INLINE,
        "painless",
        "ctx._source.users.add(params)", 
        parameters));
request.setScroll(TimeValue.timeValueMinutes(10));
BulkByScrollResponse bulkResponse = restHighLevelClient.updateByQuery(request,RequestOptions.DEFAULT);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多