I ended up using the XContentBuilder, maybe it can help you:
String source = "{\n" +
" \"person\" : {\n" +
" \"match_phrase\" : {\n" +
" \"message\" : {\n" +
" \"query\": \"" + person.getName() + "\",\n" +
" \"slop\": 2\n" +
" }\n }\n" +
" },\n" +
" \"role\": \"" + person.getRole() + "\",\n" +
" \"name\": \"" + person.getName() + "\",\n" +
" \"times_sold\": " + person.getTimesSold() + "\n" +
"}";
IndexRequest indexRequest = new IndexRequest(INDEX_NAME).source(source, XContentType.JSON);
and the query:
SearchSourceBuilder builder = new SearchSourceBuilder();
WrapperQueryBuilder wrapperQueryBuilder = QueryBuilders.wrapperQuery("{\n" +
" \"percolate\": {\n" +
" \"field\": \"person\",\n" +
" \"document\": {\n" +
" \"message\": \"" + text + "\"\n" +
" }\n" +
" }\n" +
" }");
builder.query(wrapperQueryBuilder);
SearchRequest searchRequest = new SearchRequest(ElasticInitialiser.INDEX_NAME);
searchRequest.source(builder);