在elaticsearch中使用java api进行搜索时,我只想检索一列。
目前,当我使用Java API查询时,它返回整个记录,如下所示:[{_id=123-456-7890, name=Wonder Woman, gender=FEMALE}, {_id=777-990-7890, name=Cat Woman, gender=FEMALE}]
上面的记录正确匹配th中显示的搜索条件。如下面的代码所示:
List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
SearchRequestBuilder srb = client.prepareSearch("heros")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
MatchQueryBuilder mqb;
mqb = QueryBuilders.matchQuery("name", "Woman");
srb.setQuery(mqb);
SearchResponse response = srb.execute().actionGet();
long totalHitCount = response.getHits().getTotalHits();
System.out.println(response.getHits().getTotalHits());
for (SearchHit hit : response.getHits()) {
result.add(hit.getSource());
}
System.out.println(result);
我只想要返回一列。如果我搜索名称,我只需要在列表中返回全名:"Wonder Woman", "Cat Woman"
而不是每个名称的整个json记录。如果您认为我需要在java中迭代result
地图列表,请提供一个在这种情况下如何执行此操作的示例。
答案 0 :(得分:5)
您可以指定要从搜索per documentation返回的字段。这可以通过SearchRequestBuilder.addFields(String... fields)
设置,即:
SearchRequestBuilder srb = client.prepareSearch("heros")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.addFields("name");
答案 1 :(得分:5)
更好地结合两者:
.addFields("name")
告诉ES它只需要返回它
专栏hit.field("name").getValue().toString()
获取结果当您不需要整个文档时使用.addFields
很重要,但是特定字段会降低开销和网络流量
答案 2 :(得分:3)
我明白了。
List<String> valuesList= new ArrayList<String>();
for (SearchHit hit : response.getHits()) {
result.add(hit.getSource());
valuesList.add(hit.getSource().get("name").toString());
}
答案 3 :(得分:0)
其他解决方案对我不起作用,hit.getSource()返回null。也许他们被弃用了?不确定。但是这是我的解决方案,如果你只获得一个领域并且你得到了很多结果,那么FYI可以大大提高速度。
如上所述,在SearchRequestBuilder上使用addFields(字符串),但是当您获得需要使用的值时:
hit.getFields()。get(fieldName).getValue() 要么 hit.getFields()。get(fieldName).getValues()
根据字段获取单个值或值列表。