Как сложить TOP N документов с терминами вasticsearch? - PullRequest
0 голосов
/ 04 апреля 2020

Ниже приведен пример документа на эластичный поиск.

         {
            "_index": “social”,
            "_type": “social”,
            "_id": "1632560884596186633",
            "_score": 1,
            "_source": {
                "created_date": "2017-10-24",
                "reach": 1692,                    
                "social_id": 200
            }
        },
        {
            "_index": “social”,
            "_type": “social”,
            "_id": "1626693964184981799",
            "_score": 1,
            "_source": {
                "created_date": "2017-10-25”,
                "reach": 1692,                    
                “social_id": 100               
            }
        },
        {
            "_index": “social”,
            "_type": “social”,
            "_id": "162669396418498170",
            "_score": 1,
            "_source": {
                "created_date": "2017-10-25”,
                "reach": 1692,                    
                “social_id": 50               
            }
        },
        {
            "_index": “social”,
            "_type": “social”,
            "_id": "1626693964184981756",
            "_score": 1,
            "_source": {
                "created_date": "2017-10-25”,
                "reach": 1692,                    
                “social_id": 25               
            }
        }

Вопрос: Сумма охвата для двух лучших документов на основе даты создания по социальному идентификатору.

Что я пробовал:

{
"size": 0,
"aggs": {
    "reach_bucket": {
        "terms": {
            "size": 200,
            "field": "social_id"
        },
        "aggs": {
            "media_reach_bucket": {
                "terms": {
                    "field": "created_date",
                    "size": 200
                },
                "aggs": {
                    "top_sales_hits": {
                        "top_hits": {
                            "sort": [
                                {
                                    "created_date": {
                                        "order": "desc"
                                    }
                                }
                            ],
                            "_source": {
                                "includes": [
                                    "created_date",
                                    "reach"
                                ]
                            },
                            "size": 2
                        }
                    }
                }
            }
        }
    }
}
} 

Проблема:

Не выполнять субагрегацию для top_hits.

Любое предложение будет благодарным.

1 Ответ

0 голосов
/ 04 апреля 2020

Вы можете использовать date_histogram вместо terms при ведении в день (я полагаю). Но что еще более важно, вы должны отсортировать top_hits по reach, а не created_date, поскольку в вашем ежедневном баке будет то же самое. 1009 *

"aggregations" : {
    "reach_bucket" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : 100,
          "doc_count" : 4,
          "media_reach_bucket" : {
            "buckets" : [
              {
                "key_as_string" : "2017-10-24T00:00:00.000Z",
                "key" : 1508803200000,
                "doc_count" : 4,
                "top_sales_hits" : {
                  "hits" : {
                    "total" : {
                      "value" : 4,
                      "relation" : "eq"
                    },
                    "max_score" : null,
                    "hits" : [
                      {
                        "_index" : "kart",
                        "_type" : "_doc",
                        "_id" : "3iLJRnEBZbobBB0NiV8R",
                        "_score" : null,
                        "_source" : {
                          "reach" : 40
                        },
                        "sort" : [
                          40
                        ]
                      },
                      {
                        "_index" : "kart",
                        "_type" : "_doc",
                        "_id" : "3SLJRnEBZbobBB0Nhl-Y",
                        "_score" : null,
                        "_source" : {
                          "reach" : 30
                        },
                        "sort" : [
                          30
                        ]
                      }
                    ]
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }

, чей охват вы можете затем суммировать в своих функциях постобработки.


Я не знаком с top-n суммой, только с суммами документов выше определенного Порог - в этом случае я бы использовал фильтр агрегации .

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