1

I have a document with the following schema,

 {
    "_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
        }
      }
}

I want to modify the value of field "employee" I have tried this:

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();
     }

return error info :

    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)

how to use jsonBuilder() to build a json like this:

   employee:{
          "id":"1",
          "class":"bropen",
          "name":"Tom"
   }

and modify the value of field "employee"?

--------------update------------------

I tried again:

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();
    }

}

Error info:

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)

2 Answers 2

3

updating document is easy when you use json builder.

in your case inner object name is employee so you have to make object with name as "employee".

below is the code that helps you to understand the use of 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();

you can see generated json using below code

String output = builder.string();
Sign up to request clarification or add additional context in comments.

1 Comment

I tried again using your method,but it does not work. I add error information at the end of the question.
3
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();

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.