我已经使用elasticsearch成功创建了一个索引,并且可以将这些精确的json有效负载序列化回我的java应用程序。
for (SearchHit searchHit : searchResponse.getHits()) {
try {
result.getItems().add(objectMapper.readValue(searchHit.getSourceRef().streamInput(), Program.class));
} catch (IOException e) {
throw new IllegalArgumentException("Cannot marshall json", e);
}
}
我导出到elasticsearch的有效负载大小非常大,但响应,我想要非常小。我还想让客户端动态地包含或排除某些字段。所以我这样做了,其中字段是我想要包含的字段数组。这很好用,只返回我要求的字段,但是searchHit.getSourceRef现在为null。有没有办法让它只是复制我通过杰克逊包括的字段?或者我必须始终返回整个源对象吗?或者我是否必须编写某种映射代码进行翻译(我真的想避免这种情况)?
SearchResponse searchResponse = transportClient.prepareSearch("programs")
.addFields(fields.toArray(new String[fields.size()]))
.setTypes("program")
.setQuery(query).setFrom(start).setSize(pageSize)
.execute().actionGet();
答案 0 :(得分:0)
however the searchHit.getSourceRef is now null.
它为null,因为searchHit.getSource()也为null。据我所知,当你进行搜索时,你必须在字段列表中添加“_source”。像这样:
ArrayList<String> fields = new ArrayList<String>();
fields. add("field1");
fields.add("field2");
fields.add("_source"); // add this field
SearchResponse response = transportClient.prepareSearch("programs")
.addFields(fields.toArray(new String[fields.size()]))
.execute().actionGet();