Elasticsearch之Nested Aggregation

翻译 2015年04月16日 20:52:07

                                                  (这是一个小系列:请戳:ElasticsearchNested(嵌套)系列,查看其他nested相关文章)

             In the same way as we need to use the special nested query to gain access to nested objects at search time, the dedicated nested aggregation allows

 us to aggregate fields in nested objects:

  与在检索时需要使用特定的nested查询来接触nested object一样,特定的nested聚合同样能让我们对nested object内的字段进行聚合:

curl -XGET 'localhost:9200/my_index/blogpost/_search?search_type=count' -d '
{
  "aggs":{
     "comments":{①
	    "nested":{
		   "path":"comments"
		},
		"aggs":{
		   "by_month":{
		      "date_histogram":{②
			      "field":"comments.date",
				  "interval":"month",
				  "format":"yyyy-MM"
			  },
			  "aggs":{
			     "avg_stars":{
				    "avg":{③
					   "field":"comments.stars"
					}
				 }
			  }
		   }
		}
	 }
  }
}

①:The nested aggregation “steps down” into the nested comments object.

nested 聚合进入nested评论对象。

②:Comments are bucketed into months based on the comments.date field

   评论基于comments.date字段聚合成月

③:The average number of stars is calculated for each bucket.

对于每一个簇,计算星级 的平均值。

The results show that aggregation has happened at the nested document level:

结果表明,聚合的确发生在nested文本层:

...
"aggregations": {
  "comments": {
     "doc_count": 4, 
     "by_month": {
        "buckets": [
           {
              "key_as_string": "2014-09",
              "key": 1409529600000,
              "doc_count": 1, 
              "avg_stars": {
                 "value": 4
              }
           },
           {
              "key_as_string": "2014-10",
              "key": 1412121600000,
              "doc_count": 3, 
              "avg_stars": {
                 "value": 2.6666666666666665
              }
           }
        ]
     }
  }
}

reverse_nested Aggregation

反嵌套聚合

 

A nested aggregation can access only the fields within the nested document. It can’t see fields in the root document or in a different 

nested document. However, we can step out of the nested scope back into the parent with a reverse_nested aggregation.

一个nested聚合只能接入nested文本内的字段,它不能看到根文本或者不同nested文本内的字段。但是,我们可以通过一个反嵌套聚合跳出nested局域进入父层。

For instance, we can find out which tags our commenters are interested in, based on the age of the commenter. The comment.age is

 a nested field, while the tags are in the root document:

比如我们基于评论者的年龄找出哪些标签是评论者感兴趣的。comment.age是一个nested字段,而tags位于根文本中:

curl -XGET 'localhost:9200/my_index/blogpost/_search?search_type=count' -d '
{
  "aggs":{
     "comments":{
	    "nested":{①
		   "path":"comments"
		},
		"aggs":{
		  "age_group":{
		      "histogram":{②
			     "field":"comments.age",
				 "interval":10
			  },
			  "aggs":{
			     "blogposts":{
				    "reverse_nested":{},③
					"aggs":{
					   "tags":{
					      "terms":{④
						     "field":"tags"
						  }
					   }
					}
				 }
			  }
		  }
		}
	  }
    }		
}

②:The histogram agg groups on the comments.age field, in buckets of 10 years.

histogram(直方图)聚合在comments.age字段上分组,每10年一组。

③:The reverse_nested agg steps back up to the root document.

reverse_nested聚合跳转回根文本。

④:The terms agg counts popular terms per age group of the commenter.

terms聚合计算每个年龄组的流行terms

The abbreviated results show us the following:

下面是简化结果:

..
"aggregations": {
  "comments": {
     "doc_count": 4, 
     "age_group": {
        "buckets": [
           {
              "key": 20, 
              "doc_count": 2, 
              "blogposts": {
                 "doc_count": 2, 
                 "tags": {
                    "doc_count_error_upper_bound": 0,
                    "buckets": [ 
                       { "key": "shares",   "doc_count": 2 },
                       { "key": "cash",     "doc_count": 1 },
                       { "key": "equities", "doc_count": 1 }
                    ]
                 }
              }
           },
...

When to Use Nested Objects

何时使用nested 对象。

Nested objects are useful when there is one main entity, like our blogpost, with a limited number of closely related but less important entities, 

such as comments. It is useful to be able to find blog posts based on the content of the comments, and the nested query and filter provide for

 fast query-time joins.

当有一个主要的实体,就像blogpost(博客文章),还有有限的一些相关但是没这么重要的其他实体,比如comments(评论)nested对象就显得非常有用。基于评论的内容找到博客文章是有价值的。同时为了快速查询时间拼接,还提供了nested查询和过滤。

The disadvantages of the nested model are as follows:

nested模式的缺点如下:

1.To add, change, or delete a nested document, the whole document must be reindexed. This becomes more costly the more nested

 documents there are.

1.为了增加,改变或者删除一个nested文本,整个文本必须重新建索引。nested文本越多,这就会变得代价越大。

2.Search requests return the whole document, not just the matching nested documents. Although there are plans afoot to support returning 

the best -matching nested documents with the root document, this is not yet supported.

2.检索请求返回整个文本,而不仅是匹配的nested文本。尽管有计划正在执行以能够支持返回根文本的同时返回最匹配的nested文本,但目前还未实现。



原文:http://www.elastic.co/guide/en/elasticsearch/guide/master/nested-aggregation.html

Elasticsearch嵌套式对象Nested分析

nested结构是Elasticsearch提供关系存储的一种特殊的结构,是NOSQL的一种高级特性,在传统的关系型sql中,很难做到一行记录中存储某个实体以及附属的内容,比如某个用户下评论数据,或某...
  • u012332735
  • u012332735
  • 2017年03月15日 14:13
  • 7655

Elasticsearch之Nested(嵌套)系列

1.Elasticsearch之Nested Object 2.Elasticsearch之Nested Object Mapping 3.Elasticsearch之Nested ...
  • Allenalex
  • Allenalex
  • 2015年04月14日 16:54
  • 11134

Elasticsearch之Nested Object

Given the fact that creating, deleting, and updating a single document in Elasticsearch is atomic, i...
  • Allenalex
  • Allenalex
  • 2015年04月14日 16:46
  • 10587

ES中更新一个nested字段的结构

与更新普通object字段相类似,更新nested字段只需加上type类型就可以了,例如要在tags_list这个nested字段中加入ratio字段,我们只需这样写代码即可 add_body = ...
  • yyd19921214
  • yyd19921214
  • 2017年03月02日 11:21
  • 843

[LinkedIn] Reversed Nested Integer

/** * 这道题我加了个变形,reversed的 * Given a nested list of integers, returns the sum of all integers in the ...
  • craiglin1992
  • craiglin1992
  • 2015年03月30日 23:13
  • 600

ElasticSearch聚合查询小例子

在ES里面所有的聚合实例都由AggregationBuilders类提供静态方法构造,我们先看下常用有哪些方法使用: (1)统计某个字段的数量 ValueCountBuilder vcb= Ag...
  • u010454030
  • u010454030
  • 2017年03月18日 19:39
  • 2661

Elasticsearch java API (18)Aggregations 聚合 Bucket

桶聚合编辑 全球聚合编辑 下面是如何使用 Global Aggregation 与Java API。 准备聚合请求编辑 这里有一个例子关于如何创建聚合的要求:A...
  • u012116196
  • u012116196
  • 2016年06月30日 14:20
  • 4199

ElasticSearch Aggs的一些使用方法

这段代码是关于多层聚合和嵌套域的聚合,来源:https://github.com/elasticsearch/elasticsearch/blob/master/src/test/java/org/e...
  • F7ANTY
  • F7ANTY
  • 2015年10月20日 17:39
  • 2196

Spring事务总结---传播级别以及REQUIRED_NEW及NESTED的使用场景(赞)

摘要: 在工作中时常需要用到Spring的事务,每次遇到问题都google十分浪费时间,不妨自己总结一下做个记录,希望以后遇到问题的时候能在自己的记录中找到解答。:) 超过了字数限制,强行被分割。。...
  • AlbertFly
  • AlbertFly
  • 2016年09月27日 16:38
  • 9586

Elasticsearch(十一)【NEST高级客户端--聚合】

聚合聚合框架有助于提供基于搜索查询的聚合数据。 它基于称为聚合的简单构建块,可以组合以构建复杂的数据摘要。 编写汇总 保留的聚合名称...
  • WuLex
  • WuLex
  • 2017年05月07日 23:05
  • 863
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Elasticsearch之Nested Aggregation
举报原因:
原因补充:

(最多只允许输入30个字)