elasticsearch 带过滤器和查询的ElasticSearch嵌套聚合,elasticsearch,filter,nested,aggregation,elasticsearch,Filter,Nested,Aggregation" /> elasticsearch 带过滤器和查询的ElasticSearch嵌套聚合,elasticsearch,filter,nested,aggregation,elasticsearch,Filter,Nested,Aggregation" />

elasticsearch 带过滤器和查询的ElasticSearch嵌套聚合

elasticsearch 带过滤器和查询的ElasticSearch嵌套聚合,elasticsearch,filter,nested,aggregation,elasticsearch,Filter,Nested,Aggregation,我想计算嵌套字段的中值。嵌套字段包含具有某些属性的对象列表。在计算中值之前,我想过滤掉其中的一些。 例如,假设嵌套字段中有10个对象,但计算中值时只取10个对象中的7个 query_median = { "query": { "bool": { "filter": [ { "term": { "date": "2020-05-18

我想计算嵌套字段的中值。嵌套字段包含具有某些属性的对象列表。在计算中值之前,我想过滤掉其中的一些。 例如,假设嵌套字段中有10个对象,但计算中值时只取10个对象中的7个

query_median = {
    "query": {
        "bool": {
            "filter": [
                {
                    "term": {
                        "date": "2020-05-18"
                    }
                },
                {
                    "term": {
                        "group_name": "some_name"
                    }
                }
            ]
        }
    },
    "aggs": {
        "median_value": {
            "nested": {
                "path": "people"
            },
            "aggs": {
                "median": {
                    "percentiles": {
                        "field": "people.for_median_attr",
                        "percents": [50]
                    }
                }
            }
        }
    }
}
上面的查询可以工作,但没有过滤器。当我想在
aggs
中添加额外的过滤器时,它给我的
值与没有任何过滤器的情况下的值相同。下面是我尝试过的:

query_median = {
    "query": {
        "bool": {
            "filter": [
                {
                    "term": {
                        "date": "2020-05-18"
                    }
                },
                {
                    "term": {
                        "group_name": "some_name"
                    }
                }
            ]
        }
    },
    "aggs": {
        "median_value": {
            "nested": {
                "path": "people"
            },
            "aggs": {
                "filter_out": {
                    "filter": {
                        "bool": {
                            "must": [
                                {
                                    "term": {
                                        "people.attr_not_wanted1": False
                                    },
                                    "term": {
                                        "people.attr_not_wanted2": False
                                    }
                                }
                            ]
                        }
                    },
                    "aggs": {
                        "median": {
                            "percentiles": {
                                "field": "people.for_median_attr",
                                "percents": [50]
                            }
                        }
                    }
                }
            }
        }
    }
}
示例文件:

{
        "_index" : "some_index",
        "_type" : "_doc",
        "_id" : "some_id",
        "_score" : 1.0,
        "_source" : {
          "date" : "2020-05-10",
          "group_name" : "some_name",
          "org_code" : "some_code",
          "people" : [
            {
              "nickname" : "xxx",
              "review_count" : 20.0,
              "not_wanted_1" : false,
              "not_wanted_2" : false
            },
            {
              "nickname" : "yyy",
              "review_count" : 18.0,
              "not_wanted_1" : false,
              "not_wanted_2" : false
            },
            {
              "nickname" : "zzz",
              "value_for_median" : 11.0,
              "not_wanted_1" : true,
              "not_wanted_2" : true
            },
            ...
          ]
        }
      }
    ]
  }

在这种情况下,中位数仅由两个数字计算:
20
18

你就快到了。您只是缺少了嵌套过滤器中的几个大括号,您应该选择
true
而不是
false
,因为您希望保留嵌套文档以计算它们的中值

您的查询应如下所示:

{
  "query": {
     ...
  },
  "aggs": {
    "median_value": {
      "nested": {
        "path": "people"
      },
      "aggs": {
        "filter_out": {
          "filter": {
            "bool": {
              "must": [
                {
                  "term": {
                    "people.not_wanted_1": true
                  }
                },
                {
                  "term": {
                    "people.not_wanted_2": true
                  }
                }
              ]
            }
          },
          "aggs": {
            "median": {
              "percentiles": {
                "field": "people.value_for_median",
                "percents": [
                  50
                ]
              }
            }
          }
        }
      }
    }
  }
}
结果:

  "aggregations" : {
    "median_value" : {
      "doc_count" : 3,
      "filter_out" : {
        "doc_count" : 1,
        "median" : {
          "values" : {
            "50.0" : 11.0
          }
        }
      }
    }
  }

你快到了。您只是缺少了嵌套过滤器中的几个大括号,您应该选择
true
而不是
false
,因为您希望保留嵌套文档以计算它们的中值

您的查询应如下所示:

{
  "query": {
     ...
  },
  "aggs": {
    "median_value": {
      "nested": {
        "path": "people"
      },
      "aggs": {
        "filter_out": {
          "filter": {
            "bool": {
              "must": [
                {
                  "term": {
                    "people.not_wanted_1": true
                  }
                },
                {
                  "term": {
                    "people.not_wanted_2": true
                  }
                }
              ]
            }
          },
          "aggs": {
            "median": {
              "percentiles": {
                "field": "people.value_for_median",
                "percents": [
                  50
                ]
              }
            }
          }
        }
      }
    }
  }
}
结果:

  "aggregations" : {
    "median_value" : {
      "doc_count" : 3,
      "filter_out" : {
        "doc_count" : 1,
        "median" : {
          "values" : {
            "50.0" : 11.0
          }
        }
      }
    }
  }
从上的文档中,您可以尝试将查询的“筛选”部分更新为:

    "filter_out" : {
      "filters" : {
        "filters" : [
          { "term" : { "people.attr_not_wanted1" : false   }},
          { "term" : { "people.attr_not_wanted2" : false }}
        ]
      }
    }
从上的文档中,您可以尝试将查询的“筛选”部分更新为:

    "filter_out" : {
      "filters" : {
        "filters" : [
          { "term" : { "people.attr_not_wanted1" : false   }},
          { "term" : { "people.attr_not_wanted2" : false }}
        ]
      }
    }

你能展示一个带有嵌套数组的示例文档,其中包含一些要保留的元素和一些要删除的元素吗?Val我在初始线程中添加了它-谢谢!你能展示一个带有嵌套数组的示例文档,其中包含一些要保留的元素和一些要删除的元素吗?Val我在初始线程中添加了它-谢谢!谢谢你的帮助。实际上,我想排除同时具有两个值的值
true
。因此,在我的例子中,我取所有具有
not_wanted\u 1/not_wanted\u 2=False
的对象。此查询似乎显示
'values':{'50.0':None}
确定,然后您可以将
true
更改为
false
。但是,请注意,在这些元素中,您没有任何中位数的
值。实际上,我根据我的需要重新安排了您的答案,并且它正在工作!太好了,谢谢!谢谢你的帮助。实际上,我想排除同时具有两个值的值
true
。因此,在我的例子中,我取所有具有
not_wanted\u 1/not_wanted\u 2=False
的对象。此查询似乎显示
'values':{'50.0':None}
确定,然后您可以将
true
更改为
false
。但是,请注意,在这些元素中,您没有任何中位数的
值。实际上,我根据我的需要重新安排了您的答案,并且它正在工作!太好了,谢谢!