elasticsearch 弹性试验:如何基于聚合来聚合和计算自定义字段

6ioyuze2  于 2022-11-02  发布在  ElasticSearch
关注(0)|答案(2)|浏览(178)

按字段分组

Id:1年份:1999系列标题:酷炫系列剧集标题:第一版
Id:2年份:2000系列标题:酷炫系列剧集标题:第二版
Id:3年份:2001系列标题:酷炫系列剧集标题:第三版
Id:4年份:2005系列标题:另一系列剧集标题:第一版
Id:5年份:2006系列标题:另一系列剧集标题:第二版
我如何按系列标题折叠/聚合。并在输出中具有自定义计算字段:最小-最大年数,事件计数

预期结果将是每个系列标题1个对象。

系列标题:酷系列定制-字段-年份:1999-2001年总数:3
系列标题:另一系列自定义字段-年:2005-2006年总数:2

分组依据字段可以为空

有没有可能使用聚合术语将对象按系列标题分组,而那些没有系列标题的对象将是单独的对象。
Id:1年份:1999系列标题:酷炫系列剧集标题:第一版
Id:2年份:2000系列标题:酷炫系列剧集标题:第二版
Id:3年份:2001系列标题:酷炫系列剧集标题:第三版
Id:4年份:2005系列标题:另一系列剧集标题:第一版
Id:5年份:2006系列标题:另一系列剧集标题:第二版
Id:6年份:2008系列标题:空专题节目标题:电影1
Id:7年份:2009系列标题:空专题节目标题:电影2

案例2中的预期结果每个系列标题将有1个对象,并查看单独的电影对象

系列标题:酷系列定制-字段-年份:1999-2001年总数:3
系列标题:另一系列自定义字段-年:2005-2006年总数:2
系列标题:空Ep A电影1
系列标题:空Ep电影2

3ks5zfa0

3ks5zfa01#

您可以使用多个聚合来实现此目的

  1. Terms aggregation
  2. Min aggregation
  3. Max aggregation
  4. Value count aggregation
{
  "size": 0,
  "aggs": {
    "NAME": {
      "terms": {
        "field": "Series title.keyword",
         "missing": "Missing title",
        "size": 10
      },
      "aggs": {
        "min-year": {
          "min": {
            "field": "Year"
          }
        },
        "max-year": {
          "max": {
            "field": "Year"
          }
        },
        "episode-count":{
           "value_count": {
             "field": "Episode title.keyword"
           }
        }
      }
    }
  }
}

结果

"buckets" : [
        {
          "key" : "Cool Series",
          "doc_count" : 3,
          "episode-count" : {
            "value" : 3
          },
          "max-year" : {
            "value" : 2001
          },
          "min-year" : {
            "value" : 1999
          }
        },
        {
          "key" : "Another series",
          "doc_count" : 2,
          "episode-count" : {
            "value" : 2
          },
          "max-year" : {
            "value" : 2006
          },
          "min-year" : {
            "value" : 2005
          }
        }
      ]
ha5z0ras

ha5z0ras2#

如果我没理解错的话,您可以使用terms aggsMax以及Min作为子集合。使用缺失参数定义了应如何处理缺失值的文档。默认情况下,它们将被忽略,但也可以将它们视为具有值。

PUT idx_test/_bulk
{"index":{"_id":1}}
{"year":1999, "series_title" : "Cool Series Episode", "title": "ep1"}
{"index":{"_id":2}}
{"year":2000, "series_title" : "Cool Series Episode", "title": "ep2"}
{"index":{"_id":3}}
{"year":2001, "series_title" : "Cool Series Episode", "title": "ep4"}
{"index":{"_id":4}}
{"year":2005, "series_title" : "Another series Episode", "title": "ep1"}
{"index":{"_id":5}}
{"year":2006, "series_title" : "Another series Episode", "title": "ep1"}
{"index":{"_id":6}}
{"year":2008, "series_title" : null, "title": "A Movie 1"}
{"index":{"_id":7}}
{"year":2009, "series_title" :null, "title": "A Movie 2"}

GET idx_test/_search
{
  "size": 0,
  "aggs": {
    "group_by_series_title": {
      "terms": {
        "field": "series_title.keyword",
        "missing": "group_series_title_empty", 
        "size": 10
      },
      "aggs": {
        "min_year": {
          "min": {
            "field": "year"
          }
        },
        "max_year": {
          "max": {
            "field": "year"
          }
        }
      }
    }
  }
}

Results

"aggregations": {
    "group_by_series_title": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "Cool Series Episode",
          "doc_count": 3,
          "min_year": {
            "value": 1999
          },
          "max_year": {
            "value": 2001
          }
        },
        {
          "key": "Another series Episode",
          "doc_count": 2,
          "min_year": {
            "value": 2005
          },
          "max_year": {
            "value": 2006
          }
        },
        {
          "key": "group_series_title_empty",
          "doc_count": 2,
          "min_year": {
            "value": 2008
          },
          "max_year": {
            "value": 2009
          }
        }
      ]
    }
  }

相关问题