elasticsearch - Elasticsearch 从复合聚合中排除键
问题描述
我需要在复合聚合中排除某些键。这是我的索引的一个文档作为示例:
{
"end_date": 1230314400000,
"parameter_codes": [28, 35, 30],
"platform_code": "41012",
"start_date": 1230314400000,
"station_id": 7833246
}
我执行了一个搜索请求,允许我:获取每个 platform_code/parameter_codes 对的结果,以及获取对应的 station_id 以及存储桶上的分页。
这是请求:
{
"size": 0,
"query": {
"match_all": {
"boost": 1.0
}
},
"_source": false,
"aggregations": {
"compositeAgg": {
"composite": {
"size": 10,
"sources": [{
"platform_code": {
"terms": {
"field": "platform_code",
"missing_bucket": false,
"order": "asc"
}
}
}, {
"parameter_codes": {
"terms": {
"field": "parameter_codes",
"missing_bucket": false,
"order": "asc"
}
}
}]
},
"aggregations": {
"aggstation_id": {
"terms": {
"field": "station_id",
"size": 2147483647,
"min_doc_count": 1,
"shard_min_doc_count": 0,
"show_term_doc_count_error": false,
"order": {
"_key": "asc"
}
}
},
"pipe": {
"bucket_sort": {
"sort": [{
"_key": {
"order": "asc"
}
}],
"from": 0,
"size": 10,
"gap_policy": "SKIP"
}
}
}
}
}
}
这个请求给了我以下结果:
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 8,
"successful": 8,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"composite#compositeAgg": {
"after_key": {
"platform_code": "41012",
"parameter_codes": 60
},
"buckets": [{
"key": {
"platform_code": "41012",
"parameter_codes": 28
},
"doc_count": 1,
"lterms#aggstation_id": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [{
"key": 7833246,
"doc_count": 1
}]
}
}, {
"key": {
"platform_code": "41012",
"parameter_codes": 30
},
"doc_count": 2,
"lterms#aggstation_id": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [{
"key": 7833246,
"doc_count": 1
}, {
"key": 12787501,
"doc_count": 1
}]
}
}, {
"key": {
"platform_code": "41012",
"parameter_codes": 35
},
"doc_count": 2,
"lterms#aggstation_id": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [{
"key": 7833246,
"doc_count": 1
}, {
"key": 12787501,
"doc_count": 1
}]
}
}]
}
}
}
这很好用,但我需要排除一个或多个 parameter_code。例如,通过排除“35”,我只想要键:
{
"platform_code": "41012",
"parameter_codes": 28
}
和
{
"platform_code": "41012",
"parameter_codes": 30
}
我尝试了很多选项,但无法成功执行此操作。谁能知道我该怎么做?
解决方案
可以在复合源中使用脚本查询来仅返回数组的特定值。
{
"size": 0,
"query": {
"match_all": {
"boost": 1
}
},
"_source": false,
"aggregations": {
"compositeAgg": {
"composite": {
"size": 10,
"sources": [
{
"platform_code": {
"terms": {
"field": "platform_code.keyword",
"missing_bucket": false,
"order": "asc"
}
}
},
{
"parameter_codes": {
"terms": {
"script": {
"source": """
def arr=[];
for (item in doc['parameter_codes']) {
if(item !=35)
{
arr.add(item);
}
}
return arr"""
}
}
}
}
]
},
"aggregations": {
"aggstation_id": {
"terms": {
"field": "station_id",
"size": 2147483647,
"min_doc_count": 1,
"shard_min_doc_count": 0,
"show_term_doc_count_error": false,
"order": {
"_key": "asc"
}
}
},
"pipe": {
"bucket_sort": {
"sort": [
{
"_key": {
"order": "asc"
}
}
],
"from": 0,
"size": 10,
"gap_policy": "SKIP"
}
}
}
}
}
}
推荐阅读
- windows - 如果我将代码放在模块或其他 ps1 文件中,编码问题
- javascript - 以对象为参数的 Axios GET 请求(来自后端)
- python - Heroku 上保存的图像在服务网页上不可见
- php - reactJS ,访问带有日期段的 URL 说“找不到页面”
- jquery - jQuery Table Sorter - 无法让表格对表格的列进行排序(单元格值可以在排序前由 jQuery 动态更改)
- swift - 如何从 ToolbarItem 推送视图?
- tensorflow - 神经网络可以学习选择最接近固定点的任意点吗?
- c - C sqrt 在小于 1 但大于 0 的浮点数上无法正常工作
- oracle - 我不明白。我正在尝试为 Oracle APEX 中的数据库创建第一个表
- python - cog discord.py 上只加载了 1 个命令