【问题标题】:Elasticsearch DSL : Multiple aggregationsElasticsearch DSL:多重聚合
【发布时间】:2015-05-20 07:47:09
【问题描述】:

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

 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

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

【问题讨论】:

    标签: querydsl elasticsearch


    【解决方案1】:

    我基于以下映射类型:

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

    【讨论】:

    • 再次感谢 val :)。我试图在单个聚合对象下获取输出 json 结构,其中每个键(带机场)有两个值 - AverageArrivalDelay 和 AverageDepartureDelay。您的查询给了我两个聚合对象。这再次意味着我需要对我的结果进行后处理以组合在一起。虽然这不是一个坏方法,但我的应用程序架构正在推动我尽量减少客户端应用程序的任何处理。
    • 我知道 2.0 中的新功能可能会对此有所帮助。同时,另一种解决方案是稍微更改映射并具有类似机场:字符串,延迟:int,到达:布尔值,除非您确实需要将到达和离开机场之间的“关系”保留在同一个文档中(如果您还存储了飞行的持续时间,这将是有意义的)。通过修改后的映射,我们可以创建您期望的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2017-08-28
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    相关资源
    最近更新 更多