限制弹性搜索响应的字段,但仍然使用杰克逊序列化

时间:2013-12-24 00:11:41

标签: java json elasticsearch jackson

我已经使用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();

1 个答案:

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