2013-12-24 30 views
0

我已經成功地使用elasticsearch創建了一個索引,並且可以將那些確切的json有效載荷序列化回我的java應用程序。彈性搜索響應的限制字段,但仍然使用jackson序列化

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現在是空的。有沒有辦法讓它只複製我通過傑克遜收錄的字段?或者我必須始終返回整個源對象?或者我必須寫一些映射代碼來翻譯(我真的想避免這種情況)?

SearchResponse searchResponse = transportClient.prepareSearch("programs") 
      .addFields(fields.toArray(new String[fields.size()])) 
      .setTypes("program") 
      .setQuery(query).setFrom(start).setSize(pageSize) 
      .execute().actionGet(); 

回答

0
however the searchHit.getSourceRef is now null. 

它爲null,因爲searchHit.getSource()也爲空。據我所知,當你進行搜索時,你必須將「_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(); 
+0

好吧,這是什麼,但我期望做的是讓該源只有我指定的字段。即保持其結構,但只與這些領域 –