我有一个包含以下架构的文档,
{
"_index": "test",
"_type": "user",
"_id": "2",
"_score": 1,
"_source": {
"id": 2,
"accountExpired": false,
"accountLocked": false,
"dateCreated": "2016-07-19T03:13:07Z",
"employee": {
"class": "bropen.framework.core.osm.Employee",
"id": 1
}
}
}
我想修改字段“employee”的值 我试过这个:
String employee="\"{\"class\":\"bropen.framework.core.osm.Employee\",\"id\":1,\"birthdate\":null,\"code\":null,\"dateCreated\":\"2016-07-19T03:13:07Z\",\"degree\":null,\"disabled\":false,\"email\":null,\"entryDate\":null,\"graduateDate\":null,\"groups\":[],\"identities\":[{\"class\":\"bropen.framework.core.osm.EmployeeIdentity\",\"id\":1},{\"class\":\"bropen.framework.core.osm.EmployeeIdentity\",\"id\":33}],\"identityNumber\":null,\"lastUpdated\":\"2016-07-19T07:58:34Z\",\"level\":0.10,\"location\":null,\"mainIdentityId\":1,\"major\":null,\"mobile\":null,\"name\":\"张三\",\"nation\":null,\"nativePlace\":null,\"notes\":null,\"organization\":{\"class\":\"bropen.framework.core.osm.Organization\",\"id\":2},\"payrollPlace\":null,\"professionalRank\":null,\"qualification\":null,\"rank\":null,\"sequence\":10,\"sex\":null,\"syncId\":null,\"telephoneNumber\":null,\"title\":null,\"type\":1,\"user\":{\"class\":\"bropen.framework.core.security.User\",\"id\":2},\"workingDate\":null,\"workingYears\":null}\"";
try {
client.prepareUpdate("test", "user", "2")
.setDoc(jsonBuilder().startObject().field("testfield", employee).endObject()).get();
} catch (IOException e) {
e.printStackTrace();
}
返回错误信息:
java.util.concurrent.ExecutionException: RemoteTransportException[[node-1][192.168.0.224:9300][indices:data/write/update]]; nested: RemoteTransportException[[node-1]
[192.168.0.224:9300][indices:data/write/update[s]]]; nested:
MapperParsingException[object mapping for [employee] tried to parse field [employee] as object, but found a concrete value];
at org.elasticsearch.common.util.concurrent.BaseFuture$Sync.getValue(BaseFuture.java:290)
如何使用jsonBuilder()
构建一个像这样的json:
employee:{
"id":"1",
"class":"bropen",
"name":"Tom"
}
并修改字段“employee”的值?
--------------更新------------------
我再试一次:
public static void upMethod1() {
XContentBuilder json;
try {
json = jsonBuilder().startObject("employee").field("id", 1)
.field("class", "bropen").field("name", "Tom").endObject();
UpdateRequest request = new UpdateRequest();
request.index("test");
request.type("user");
request.id("2");
request.doc(json);
client.update(request).get();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
错误信息:
java.util.concurrent.ExecutionException: RemoteTransportException[[node-1][127.0.0.1:9300][indices:data/write/update]]; nested: RemoteTransportException[[node-1][192.168.0.87:9300][indices:data/write/update[s]]]; nested: NotSerializableExceptionWrapper[not_x_content_exception: Compressor detection can only be called on some xcontent bytes or compressed xcontent bytes];
at org.elasticsearch.common.util.concurrent.BaseFuture$Sync.getValue(BaseFuture.java:290)
答案 0 :(得分:2)
更新文档非常简单。
在您的情况下,内部对象名称是employee,因此您必须将名称为" employee"的对象。
下面是帮助您了解json builder的使用的代码。
XContentBuilder json = jsonBuilder()
.startObject("employee")
.field("id", 1)
.field("class", "bropen")
.field("name","Tom")
.endObject();
UpdateRequest request = new UpdateRequest();
request.index("test");
request.type("user");
request.id("2");
request.doc(json);
client.update(request).get();
您可以使用以下代码
查看生成的jsonString output = builder.string();
答案 1 :(得分:2)
json = jsonBuilder().startObject()
.startObject("employee")
.field("id", 1)
.field("class", "bropen")
.field("name", "Tom")
.endObject()
.endObject();
UpdateRequest request = new UpdateRequest();
request.index("test");
request.type("user");
request.id("2");
request.doc(json);
System.out.println(json.toString());
client.update(request).get();