Elasticsearch仅获取存储桶大小大于给定数字的那些日期直方图

时间:2019-04-26 11:14:07

标签: elasticsearch

我有以下查询,其中我每月获取最近3年的数据,我还获取其中存在数据的月数(存储桶)。以下是我的查询:

result = ERROR: No files found with the specified search criteria.

但是,现在我只想拥有存储桶数大于30的那些date_histograms。在ElasticSearch中可以吗?如果是,那怎么办?

上面的查询给我以下结果:

result = 

我只希望“ count_buckets”中“ count”大于30的那些桶。

2 个答案:

答案 0 :(得分:2)

如果我的理解正确,您要尝试的是根据count_buckets.count值对存储桶进行过滤。如果date_histogram创建的存储桶数大于30,则应保留存储桶(针对compId),否则应将其排除。换句话说,您要根据条件选择存储桶。为此,您已经添加了stats_bucket聚合来获取存储桶数。现在,它可以用作bucket selector aggregation的参数。桶选择器聚合完全可以满足要求。

只需将bucket_selector聚合添加到您的查询中,如下所示:

{
  "size": 0,
  "query": {
    "bool": {
      "filter": {
        "terms": {
          "compId": [
            111,
            112
          ]
        }
      },
      "must": {
        "range": {
          "dateCreated": {
            "from": "2016-04-01",
            "to": "2019-03-31",
            "format": "yyyy-MM-dd"
          }
        }
      }
    }
  },
  "aggs": {
    "grp_company": {
      "terms": {
        "field": "compId"
      },
      "aggs": {
        "data_per_month": {
          "date_histogram": {
            "field": "dateCreated",
            "interval": "month"
          }
        },
        "count_buckets": {
          "stats_bucket": {
            "buckets_path": "data_per_month._count"
          }
        },
        "bucket_filter": {
          "bucket_selector": {
            "buckets_path": {
              "bucket_count": "count_buckets.count"
            },
            "script": "params.bucket_count > 30"
          }
        }
      }
    }
  }
}

答案 1 :(得分:1)

是的,您可以根据需要在词汇聚合中使用min_doc_count参数(值30)。 min_doc_count是获得这样结果的最有效方法。即使在这种情况下,您也不需要使用count_buckets,也可以使用同一聚合,请遵循以下代码:

...
...
"aggs": {
        "grp_company": {
            "terms": {
                "field": "compId",
                "min_doc_count": 30
            },
            "aggs": {
                "data_per_month": {
                    "date_histogram": {
                        "field": "dateCreated",
                        "interval": "month"
                    }
                },
                "count_buckets": {
                    "stats_bucket": { --> I am getting the count of buckets here
                        "buckets_path": "data_per_month._count"
                    }
                }
            }
        }
    }

上面的汇总将仅返回在30个匹配中找到的那些存储桶。默认值为1。

为进一步了解您可以在这里阅读Elastic Official文档:min_doc_count Setting

希望这会对您有所帮助。