首页 > 解决方案 > Elasticsearch:从对象映射的特定对象中获取最大值和最小值

问题描述

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

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

我是弹性搜索的新手,有人可以帮忙吗?谢谢。

标签: jsonelasticsearchnestedmaxmin

解决方案


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

推荐阅读