elasticsearch 带过滤器和查询的ElasticSearch嵌套聚合
我想计算嵌套字段的中值。嵌套字段包含具有某些属性的对象列表。在计算中值之前,我想过滤掉其中的一些。 例如,假设嵌套字段中有10个对象,但计算中值时只取10个对象中的7个elasticsearch 带过滤器和查询的ElasticSearch嵌套聚合,elasticsearch,filter,nested,aggregation,elasticsearch,Filter,Nested,Aggregation,我想计算嵌套字段的中值。嵌套字段包含具有某些属性的对象列表。在计算中值之前,我想过滤掉其中的一些。 例如,假设嵌套字段中有10个对象,但计算中值时只取10个对象中的7个 query_median = { "query": { "bool": { "filter": [ { "term": { "date": "2020-05-18
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
。但是,请注意,在这些元素中,您没有任何中位数的值。实际上,我根据我的需要重新安排了您的答案,并且它正在工作!太好了,谢谢!