Добрый день, ребята.У меня есть тип документа «generalTask» с массивом вложенных документов с именем «completeUser».
Вот отображение:
{
"generalTask": {
"properties": {
"id": {
"type": "long"
},
"completeUser": {
"type": "nested",
"properties": {
"completeTime": {
"type": "long"
},
"userId": {
"type": "long"
}
}
}
}
}
}
И теперь у нас есть два документа.
например,
{
"_source": {
"id": 1001,
"completeUser": [
{
"userId": 1,
"completeTime": 100
},
{
"userId": 1,
"completeTime": 300
},
{
"userId":1,
"completeTime": 500
}
]
}
}
и
{
"_source": {
"id": 1002,
"completeUser": [
{
"userId": 1,
"completeTime": 200
},
{
"userId": 1,
"completeTime": 400
},
{
"userId":1,
"completeTime": 600
}
]
}
}
Я могу получить docCount (который равен 6) путем вложенной агрегации, например:
BoolQueryBuilder query = QueryBuilders.boolQuery();
query.must(nestedQuery("completeUser", termQuery("completeUser.userId", 1)));
BoolQueryBuilder builder = getClient().prepareSearch(getIndexName()).setTypes(getIndexType()).setQuery(query)
.addAggregation(AggregationBuilders.nested("nested").path("completeUser")
.subAggregation(AggregationBuilders.count("count").field("completeUser.userId"))).setSize(0);
SearchResponse searchResponse = getSearchResponse(builder);
Nested nested = searchResponse.getAggregations().get("nested");
long docCount = nested.getDocCount(); // the docCount is 6
, но естьв searchResponse по-прежнему только 2 документа:
SearchRequestBuilder builder = getClient().prepareSearch(getIndexName()).setTypes(getIndexType())
.setSearchType(SearchType.QUERY_THEN_FETCH).setQuery(query).setFrom(0).setSize(5); // the size is 5
builder.addSort(SortBuilders.fieldSort("completeUser.completeTime")
.setNestedFilter(FilterBuilders.termFilter("completeUser.userId", 1))
.order(SortOrder.DESC));
SearchResponse searchResponse = getSearchResponse(builder);
Но мне нужны дубликаты документов на основе completeTime.
Как получить 5 (значение размера) документов в searchResponseзаказать по полной программе?
О, да.Версия ElasticSearch - 1.4.5