在 ElasticSearch 2.X 中,当我想从 Java API 中的特定类型查询特定字段时,我可以执行以下操作:
public List<String> getNames(String index, String type) {
List<String> names = new ArrayList<>();
SearchResponse scrollResp = client.prepareSearch()
.setIndices(index)
.setTypes(type)
.addFields("my_name")
.setQuery(QueryBuilders.matchAllQuery())
.setSize(10).execute().actionGet();
for (SearchHit hit : scrollResp.getHits().getHits()) {
Map<String, SearchHitField> fields = hit.getFields();
String name = fields.get("my_name").value();
names.add(name);
}
return names;
}
但是,在 ES 5.0 中,“addFields”方法消失了。有一种叫做“addStoredField”的东西。但是,如果您没有明确地将映射中的字段标记为已存储,则这似乎不起作用。上面的代码的“hit.getFields()”只是返回一组空字段 (fields.size() == 0)。
如何在 5.X 中获得与 2.X 相同的功能?也就是说,从结果中获取特定字段,而不显式存储它们..?
我在这里使用 PreBuiltTransportClient 作为客户端。
最佳答案
如果您使用 .setFetchSource
方法来定义您正在使用的字段,该怎么办:
SearchResponse scrollResp = client.prepareSearch()
.setIndices(index)
.setTypes(type)
.setSearchType(SearchType.QUERY_AND_FETCH)
.setFetchSource(new String[]{"my_name"}, null) <--- your specific field
.setQuery(QueryBuilders.matchAllQuery())
.setSize(10).execute().actionGet();
你可以看看这个SO以及。
关于java - ElasticSearch 5.0 Java获取特定字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40881858/