Мы пытаемся создать агрегацию на основе двух полей ключевых слов.
Вот поля, которые нас интересуют:
- document_type : чтобы определить из всех наших документов, какое подмножество документов мы хотим.
- document_subtype Чтобы определить подтип документа.
В отображении они находятся на корневом уровне, что означает
{
"document_type": "blog"
"document_subtype": "post"
}
Наш желаемый результат очень прост, поскольку нам просто нужно сгенерировать document_type с вложенным агрегированием счетчика document_subtype, например, так:
"aggs": {
"agg_terms_document_type": {
"terms": {
"size": 1,
"field": "document_type"
},
"aggs": {
"agg_filter_document_subtypes" : {
"terms" : { "field": "document_subtype"}
}
}
}
}
Теперь вот интересная часть: что если мы захотим отсортировать по определенному подтипу, скажем, что подтип документа «post».
Мы не можем использовать оператор заказа с этим запросом, так как вложенный запрос возвращает корзину. Поэтому мы изменили запрос, поскольку нам нужны только два типа document_subtypes: post и comment . Это выглядит так:
"aggs": {
"agg_terms_document_type": {
"terms": {
"size": 5,
"field": "document_type",
"order": {"agg_filter_post>agg_post_count": "desc"}
},
"aggs": {
"agg_filter_comment" : {
"filter" : { "term" : { "document_subtype" : "comment" }},
"aggs": {
"agg_comment_count":{
"value_count" : { "field" : "document_subtype" }
}
}
}
"agg_filter_post" : {
"filter" : { "term" : { "document_subtype" : "post" }},
"aggs": {
"agg_post_count":{
"value_count" : { "field" : "document_subtype" }
}
}
}
}
}
}
Это возвращает правильные результаты и правильное упорядочение, если ваш запрос или агрегат фильтров не содержат осколок, который не возвращает никаких документов. В этом случае мы получаем неправильное количество документов, потому что этот осколок завершается ошибкой.
"_shards": {
"total": 10,
"successful": 9,
"failed": 1,
"failures": [
{
"shard": 8,
"index": "document_to_search",
"node": "dMNUrtcyR1-nQamcjtJ3vA",
"reason": {
"type": "array_index_out_of_bounds_exception",
"reason": null
}
}
]
}
Мои вопросы следующие:
- Есть ли способ обойти это исключение?
- Если нет способа обойти это, что было бы хорошим способом для генерации этого упорядоченного термина на основе подсчета субдокументов?
Спасибо