【问题标题】:Elasticsearch - How to get min/max/avg of set of nested documentsElasticsearch - 如何获取嵌套文档集的最小/最大/平均值
【发布时间】:2015-05-06 03:29:42
【问题描述】:

鉴于 Elasticsearch 中的以下映射和文档,我如何获得一组匹配特定条件的嵌套文档的最小/最大/平均值?例如,我怎样才能让他们成为狗的宠物的最小年龄?我的过滤器得到了正确的养狗的人,但是我如何制作最小值然后根据正确的嵌套文档进行计算。

(1) 映射

{
   "myIndex": {
      "mappings": {
         "person": {
            "properties": {
               "name": {
                  "type": "string"
               },
               "pets": {
                  "type": "nested",
                  "properties": {
                     "age": {
                        "type": "long"
                     },
                     "name": {
                        "type": "string"
                     },
                     "type": {
                        "type": "string"
                     }
                  }
               }
            }
         }
      }
   }
}

(2) 数据

{
  "name": "bob",
  "pets": [
    {
      "type": "dog",
      "name": "wolfie",
      "age": 20
    },
    {
      "type": "cat",
      "name": "kitty",
      "age": 6
    }
  ]
}

{
  "name": "bill",
  "pets": [
    {
      "type": "fish",
      "name": "goldie",
      "age": 2
    },
    {
      "type": "cat",
      "name": "meowie",
      "age": 18
    }
  ]
}

(3) 查询与聚合

{
  "query": {
    "filtered": {
      "filter": {
        "nested": {
          "path": "pets",
          "filter" : {
            "terms": {
              "pets.type": ["dog"]
            }
          }
        }
      }
    }
  },
  "aggs": {
    "minage": {
      "nested": {
        "path": "pets"
      },
      "aggs": {
        "minage": {
          "min": {
            "field": "age"
          }
        }
      }
    }
  }
}

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    我认为你可以通过filter aggregation 和嵌套过滤器的join option 的组合得到你想要的。

    这段代码对我有用:

    DELETE /test_index
    
    PUT /test_index
    {
       "settings": {
          "number_of_shards": 1
       },
       "mappings": {
           "person": {
                "properties": {
                   "name": {
                      "type": "string"
                   },
                   "pets": {
                      "type": "nested",
                      "properties": {
                         "age": {
                            "type": "long"
                         },
                         "name": {
                            "type": "string"
                         },
                         "type": {
                            "type": "string"
                         }
                      }
                   }
                }
             }
       }
    }
    
    PUT /test_index/person/1
    {
      "name": "bob",
      "pets": [
        {
          "type": "dog",
          "name": "wolfie",
          "age": 20
        },
        {
          "type": "cat",
          "name": "kitty",
          "age": 6
        }
      ]
    }
    
    PUT /test_index/person/2
    {
      "name": "bill",
      "pets": [
        {
          "type": "fish",
          "name": "goldie",
          "age": 2
        },
        {
          "type": "cat",
          "name": "meowie",
          "age": 18
        }
      ]
    }
    
    PUT /test_index/person/3
    {
      "name": "john",
      "pets": [
        {
          "type": "dog",
          "name": "oldie",
          "age": 25
        }
      ]
    }
    
    POST /test_index/_search?search_type=count
    {
       "aggs": {
          "minage_1": {
             "nested": {
                "path": "pets"
             },
             "aggs": {
                "minage_2": {
                   "filter": {
                      "nested": {
                         "path": "pets",
                         "filter": {
                            "terms": {
                               "pets.type": [
                                  "dog"
                               ]
                            }
                         },
                         "join": false
                      }
                   },
                   "aggs": {
                      "min_age_3": {
                         "min": {
                            "field": "age"
                         }
                      }
                   }
                }
             }
          }
       }
    }
    ...
    {
       "took": 2,
       "timed_out": false,
       "_shards": {
          "total": 1,
          "successful": 1,
          "failed": 0
       },
       "hits": {
          "total": 3,
          "max_score": 0,
          "hits": []
       },
       "aggregations": {
          "minage_1": {
             "doc_count": 5,
             "minage_2": {
                "doc_count": 2,
                "min_age_3": {
                   "value": 20
                }
             }
          }
       }
    }
    

    【讨论】:

    • 感谢您对过滤器聚合的介绍。那成功了。在您的示例中,内部 minage_2 嵌套似乎是多余的,我不需要加入。 "aggs": { "dog": { "filter": { "term": { "type": "dog" } }, "aggs": {"minage": {"min": {"field": "年龄”} } } } }
    • 嗯,由于某种原因,这种组合对我不起作用。所以某处有些不同。无论如何,很高兴它有所帮助。在此过程中我也学到了一些东西。
    • 嗯。我一定是误读了我的结果,因为我精简的聚合没有产生正确的结果,而你的却产生了。最外面的 minage_1 嵌套聚合对我来说似乎很奇怪,而且它似乎是针对年龄的 minage_3 聚合,那为什么不能放在那里呢?
    • 你好先生@SloanAhrens 你还活跃吗?希望你不介意帮我解决这个问题? stackoverflow.com/questions/58797633/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 2018-07-01
    • 2020-08-22
    • 1970-01-01
    • 2021-11-02
    • 2019-05-08
    相关资源
    最近更新 更多