Elasticsearch:从对象映射的特定对象中获取最大值和最小值

Elasticsearch: get the max and min value form a specific object of a maps of objects

我有弹性索引的映射,我试图获取特定传感器一天的最大值,但我的查询获取了所有传感器的值。

  "sensor": {
    "type": "nested",
    "properties": {
      "type": {
        "type": "integer"
      },
      "name": {
        "type": "keyword"
      },
      "number": {
        "type": "integer"
      },
      "values": {
        "type": "nested",
        "properties": {
          "type": {
            "type": "text"
          },
          "value": {
            "type": "float"
          },
          "unit": {
            "type": "text"
          },
          "Lmin": {
            "type": "float"
          },
          "Lmax": {
            "type": "float"
          }
        }
      }
    }

这是对象的地图,

我只需要 13 号传感器的 las day 的最大值和最小值,我试过了,但我得到了所有传感器的最大值。

  {"query": {
    "nested": {
      "path": "sensor",
      "query": {
        "nested": {
          "path": "sensor.values",
          "query": {
            "bool": {
              "must": [
                {
                  "match": {
                    "sensor.values.type": "TEMPERATURE"
                  }
                }
              ]
            }
          }
        }
      }
    }
  },
  "aggs": {
    "agg_by_type": {
      "nested": {
        "path": "sensor.values"
      },
      "aggs": {
        "max_value": {
          "max": {
            "field": "sensor.values.value"
          }
        }
      }
    }
  }
}

我是 elasticsearch 的新手,有人可以帮忙吗?谢谢。

您还需要在聚合部分添加嵌套过滤器以仅聚合相关的嵌套文档,即与 TEMPERATURE 相关的文档,如下所示:

{
  "query": {
    "nested": {
      "path": "sensor",
      "query": {
        "nested": {
          "path": "sensor.values",
          "query": {
            "bool": {
              "must": [
                {
                  "match": {
                    "sensor.values.type": "TEMPERATURE"
                  }
                }
              ]
            }
          }
        }
      }
    }
  },
  "aggs": {
    "agg_by_type": {
      "nested": {
        "path": "sensor.values"
      },
      "aggs": {
        "temperature_only": {
          "filter": {
            "match": {
              "sensor.values.type": "TEMPERATURE"
            }
          },
          "aggs": {
            "max_value": {
              "max": {
                "field": "sensor.values.value"
              }
            }
          }
        }
      }
    }
  }
}

在另一个项目中工作了几天后,我回来尝试进行此查询,最后我可以做到,现在我可以获取每天、每小时和按传感器类型的数据,感谢您的帮助.

这是我的代码,如果有人正在尝试相同的话。

  {
  "query": {
    "bool": {
      "filter": [
        {
          "bool": {
            "must": [
              {
                "match": {
                  "mac": "34:ab:95:8f:84:c0"
                }
              }
            ],
            "filter": [
              {
                "range": {
                  "timestamp": {
                    "gte": "2021-08-10",
                    "lt": "2021-08-25"
                  }
                }
              }
            ]
          }
        },
        {
          "nested": {
            "path": "sensor",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "sensor.type": 1
                    }
                  }
                ],
                "should": [
                  {
                    "nested": {
                      "path": "sensor.values",
                      "query": {
                        "bool": {
                          "must": [
                            {
                              "match": {
                                "sensor.values.type": "HUMIDITY"
                              }
                            },
                            {
                              "match": {
                                "sensor.values.type": "TEMPERATURE"
                              }
                            }
                          ]
                        }
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "values_per_day": {
      "date_histogram": {
        "field": "timestamp",
    "fixed_interval": "1d",
    "format" : "yyyy-MM-dd HH:mm:ss"
      },
      "aggs": {
        "agg_type": {
          "nested": {
            "path": "sensor"
          },
          "aggs": {
            "type_only": {
              "filter": {
                "match": {
                  "sensor.type": 1
                }
              },
              "aggs": {
                "agg_by_type": {
                  "nested": {
                    "path": "sensor.values"
                  },
                  "aggs": {
                    "temperature_only": {
                      "filter": {
                        "match": {
                          "sensor.values.type": "TEMPERATURE"
                        }
                      },
                      "aggs": {
                        "max_value": {
                          "max": {
                            "field": "sensor.values.value"
                          }
                        },
                        "min_value": {
                          "min": {
                            "field": "sensor.values.value"
                          }
                        }
                      }
                    },
                    "humedity_only": {
                      "filter": {
                        "match": {
                          "sensor.values.type": "HUMIDITY"
                        }
                      },
                      "aggs": {
                        "max_value": {
                          "max": {
                            "field": "sensor.values.value"
                          }
                        },
                        "min_value": {
                          "min": {
                            "field": "sensor.values.value"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "from": 0,
  "sort": [
    {
      "timestamp": {
        "order": "desc"
      }
    }
  ]
}