如何在聚合中获取特定的_source字段

时间:2019-02-12 11:44:06

标签: elasticsearch elasticsearch-aggregation

我正在探索将在应用程序中使用的ElasticSearch,它将处理大量数据并针对它们生成一些统计结果。我的要求是检索特定字段的某些统计信息。例如,对于给定的字段,我想检索其唯一值和每个值的文档频率以及值的长度。值长度随每个文档一起索引。 到目前为止,我已经使用以下查询对Terms Aggregation进行了实验:

{
  "size": 0,
  "query": {
  "match_all": {}
},
 "aggs": {
 "type_count": {
   "terms": {
     "field": "val.keyword",
     "size": 100
   }
  }
 }
}

查询返回val字段中的所有值以及每个值出现在其中的文档数。我也希望返回字段val_len。是否可以使用ElasticSearch做到这一点?换句话说,是否可以在存储桶中包含特定的_source字段?我已经浏览了在线提供的文档,但是还没有找到解决方案。 希望有人可以指出正确的方向。预先感谢!

我尝试通过以下方式包括_source

 "aggs": {
    "type_count": {
     "terms": {
        "field": "val.keyword",
        "size": 100        
      },
        "_source":["val_len"]
    }
  }

"aggs": {
 "type_count": {
   "terms": {
     "field": "val.keyword",
     "size": 100,
      "_source":["val_len"]
    }     
  }
}

但是我想这不是正确的方法,因为两者都给了我解析错误的机会。

1 个答案:

答案 0 :(得分:2)

您需要使用另一个名为top_hits的子聚合,如下所示:

"aggs": {
 "type_count": {
   "terms": {
     "field": "val.keyword",
     "size": 100
    },
    "aggs": {
      "hits": {
        "top_hits": {
          "_source":["val_len"],
          "size": 1
        }
      }
    }
  }
}

另一种实现方法是使用另一个avg子聚合,以便您也可以对其进行排序

"aggs": {
 "type_count": {
   "terms": {
     "field": "val.keyword",
     "size": 100,
     "order": {
       "length": "desc"
     }
    },
    "aggs": {
      "length": {
        "avg": {
          "field": "val_len"
        }
      }
    }
  }
}