【问题标题】:Elasticsearch: get the max and min value form a specific object of a maps of objectsElasticsearch:从对象映射的特定对象中获取最大值和最小值
【发布时间】:2021-12-21 17:35:30
【问题描述】:

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

  "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 号传感器的前一天的最大值和最小值,我试了一下,但我得到了所有传感器的最大值。

  {"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 的新手,有人可以帮忙吗?谢谢。

【问题讨论】:

    标签: json elasticsearch nested max min


    【解决方案1】:

    您还需要在聚合部分添加嵌套过滤器以仅聚合相关的嵌套文档,即与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"
                  }
                }
              }
            }
          }
        }
      }
    }
    

    【讨论】:

    • 太感谢了,这对我有用,我很接近:)。如果你有时间,你能告诉我如何按类型过滤这个查询吗?我尝试使用 sensor.type = 1 或 13 匹配的另一个条件,但查询有错误,我无法执行查询工作,例如,温度传感器可以是传感器类型为“温度”的传感器类型 1 “HUMEDYTY”的传感器,传感器类型13,仅是传感器类型“TEMPERATURE”。我需要传感器类型 1 的最大值和最小值并输入“温度”。如何按日期范围过滤此数据?
    【解决方案2】:

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

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

      {
      "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"
          }
        }
      ]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-28
      • 2014-12-01
      相关资源
      最近更新 更多