Агрегирование условий с вложенным заказом - PullRequest
0 голосов
/ 02 сентября 2018

Мы пытаемся создать агрегацию на основе двух полей ключевых слов.

Вот поля, которые нас интересуют:

  • 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
            }
        }
    ]
}

Мои вопросы следующие:

  1. Есть ли способ обойти это исключение?
  2. Если нет способа обойти это, что было бы хорошим способом для генерации этого упорядоченного термина на основе подсчета субдокументов?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...