Elasticsearch DSL:多重聚合

Elasticsearch DSL : Multiple aggregations

下面显示的是我的数据类型的结构。

 ArrivalAirport | DepartureAirport  | ArrivalDelay | DepartureDelay 
 A              | B                 |    2         |     5
 B              | C                 |    3         |     6
 C              | A                 |    4         |     7
 A              | B                 |    5         |     8

我想一起表演

  1. 在 ArrivalAirport 上聚合平均 ArrivalDelay &
  2. 使用平均 DepartureDelay 在 DepartureAirport 上聚合。

我期望的输出是这样的:

 Airport | AverageArrivalDelay | AverageDepartureDelay 
 A       |        3.5          |        7
 B       |        3            |        6.5
 C       |        4            |        6

我可以分别进行两个聚合以获得:

 ArrivalAirport | AverageArrivalDelay 
 A              |        3.5          
 B              |        3            
 C              |        4   

通过做:

 "aggs": {
    "ArrivalAirport": {
      "terms": {
        "field": "ArrivalAirport "
      },
      "aggs": {
        "AverageArrivalDelay ": {
          "avg": {
            "field": "ArrivalDelay"
          }
        }
      }
    }
  }

类似地,AverageDepartureDelay 得到这样的聚合。

 DepartureAirport | AverageDepartureDelay 
 A              |        7          
 B              |        6.5            
 C              |        6

我正在寻找一种方法,我不必在应用程序级别合并这两个结果。有什么想法吗?

我基于以下映射类型:

curl -XPUT localhost:9200/tests -d '
{
  "mappings": {
    "test1": {
      "properties": {
        "ArrivalAirport": {
          "type": "string"
        },
        "DepartureAirport": {
          "type": "string"
        },
        "DepartureDelay": {
          "type": "integer"
        },
        "ArrivalDelay": {
          "type": "integer"
        }
      }
    }
  }
}'

并创建了四个与您上面的数据 table 匹配的文档。

curl -XPOST localhost:9200/tests/_bulk -d '
{"index": {"_type": "test1", "_id": 1}}
{"ArrivalAirport": "A", "DepartureAirport": "B", "ArrivalDelay": 2, "DepartureDelay": 5}
{"index": {"_type": "test1", "_id": 2}}
{"ArrivalAirport": "B", "DepartureAirport": "C", "ArrivalDelay": 3, "DepartureDelay": 6}
{"index": {"_type": "test1", "_id": 3}}
{"ArrivalAirport": "C", "DepartureAirport": "A", "ArrivalDelay": 4, "DepartureDelay":7}
{"index": {"_type": "test1", "_id": 4}}
{"ArrivalAirport": "A", "DepartureAirport": "B", "ArrivalDelay": 5, "DepartureDelay": 8}
'

将 return 您期望的结果的聚合查询如下所示:

curl -XPOST localhost:9200/tests/_search -d '
{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "Arrivals": {
      "filter": {
        "terms": {
          "ArrivalAirport": [
            "a",
            "b",
            "c"
          ]
        }
      },
      "aggs": {
        "Arrival": {
          "terms": {
            "field": "ArrivalAirport"
          },
          "aggs": {
            "AverageArrivalDelay": {
              "avg": {
                "field": "ArrivalDelay"
              }
            }
          }
        }
      }
    },
    "Departures": {
      "filter": {
        "terms": {
          "DepartureAirport": [
            "a",
            "b",
            "c"
          ]
        }
      },
      "aggs": {
        "Departure": {
          "terms": {
            "field": "DepartureAirport"
          },
          "aggs": {
            "AverageDepartureDelay": {
              "avg": {
                "field": "DepartureDelay"
              }
            }
          }
        }
      }
    }
  }
}'