Я пытаюсь выполнить запрос Elasticsearch с помощью Java REST-клиента высокого уровня.Основная цель - сгруппировать результаты для меня.Вот данные:
"hits" : [
{
"_index" : "my_index",
"_type" : "object",
"_id" : "X4sSPmYB62YwufswHQbx",
"_score" : 1.0,
"_source" : {
"objId" : "1",
"stepId" : "step_one",
"status" : "RUNNING",
"timestamp" : 1515974400
}
},
{
"_index" : "my_index",
"_type" : "object",
"_id" : "15QRP2YB62YwufswAApl",
"_score" : 1.0,
"_source" : {
"objId" : "1",
"stepId" : "step_one",
"status" : "DONE",
"timestamp" : 1516406400
}
},
{
"_index" : "my_index",
"_type" : "object",
"_id" : "QpMOP2YB62YwufswrfYn",
"_score" : 1.0,
"_source" : {
"objId" : "1",
"stepId" : "step_two",
"status" : "RUNNING",
"timestamp" : 1516492800
}
},
{
"_index" : "my_index",
"_type" : "object",
"_id" : "VZMPP2YB62YwufswJ_r0",
"_score" : 1.0,
"_source" : {
"objId" : "1",
"stepId" : "step_two",
"status" : "DONE",
"timestamp" : 1517356800
}
},
{
"_index" : "my_index",
"_type" : "object",
"_id" : "XZMPP2YB62YwufswQfrc",
"_score" : 1.0,
"_source" : {
"objId" : "2",
"stepId" : "step_one",
"status" : "DONE",
"timestamp" : 1517788800
}
}
}
]
Например, для objId = 1 я ожидаю получить что-то вроде:
{
"objId" : "1",
"stepId" : "step_one",
"status" : "DONE",
"timestamp" : 1516406400
},
{
"objId" : "1",
"stepId" : "step_two",
"status" : "DONE",
"timestamp" : 1517356800
}
Теперь у меня есть этот метод Java:
private List<MyObject> search(String objId) {
MatchPhraseQueryBuilder queryBuilder = QueryBuilders.matchPhraseQuery("objId", objId);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(queryBuilder);
searchSourceBuilder.size(1000);
SearchRequest searchRequest = new SearchRequest("my_index");
searchRequest.types("object");
searchRequest.source(searchSourceBuilder);
try {
SearchResponse searchResponse = restHighLevelClient.search(searchRequest);
return Arrays.stream(searchResponse.getHits().getHits())
.map(this::toMyObject)
.collect(toList());
} catch (IOException ex) {
log.error("Error retrieving records from elasticsearch. {} ", ex);
}
return new ArrayList<>();
}
Но этот метод возвращает только список объектов, найденных objId.
Мой вопрос: возможно ли найти объекты по значению objId , сгруппировать их по stepId и, наконец, отфильтруйте результат по последней отметке времени ?