Yao Pan
Yao Pan

Reputation: 524

how to use Elasticsearch jsonBuilder() in java?

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)

Upvotes: 1

Views: 6350

Answers (2)

Yao Pan
Yao Pan

Reputation: 524

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

Upvotes: 3

Vishal Patel
Vishal Patel

Reputation: 584

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

Upvotes: 3

Related Questions