Elasticsearch DSL:多种聚合

莫希特

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

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

我想一起表演

  1. 在ArrivalAirport上汇总的平均ArrivalDelay&
  2. 在DepartureAirport上聚合,平均DepartureDelay。

我期望输出是这样的:

 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"
        }
      }
    }
  }
}'

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

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}
'

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

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"
              }
            }
          }
        }
      }
    }
  }
}'

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章