【发布时间】: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 信息。
谢谢!
【问题讨论】:
-
您进行的第一个查询使用更新 API,而带有 REST 客户端的查询使用按查询更新 API,因此它们是不同的。这就是您要查找的内容:elastic.co/guide/en/elasticsearch/client/java-rest/current/…
标签: java elasticsearch