[英]elastic search : Aggregating the specific nested documents only
我想聚合满足给定查询的特定嵌套文档。
让我通过一个例子来解释它。 我在索引中插入了两条记录:
第一个文件是
{
"project": [
{
"subject": "maths",
"marks": 47
},
{
"subject": "computers",
"marks": 22
}
]
}
第二份文件是
{
"project": [
{
"subject": "maths",
"marks": 65
},
{
"subject": "networks",
"marks": 72
}
]
}
其中包含主题以及每个记录中的标记。 从这些文档中,我需要从给定的文档中平均获得一个maths
学科的平均水平。
我试过的查询是:
{
"size": 0,
"aggs": {
"avg_marks": {
"avg": {
"field": "project.marks"
}
}
},
"query": {
"bool": {
"must": [
{
"query_string": {
"query": "project.subject:maths",
"analyze_wildcard": true,
"default_field": "*"
}
}
]
}
}
}
这将返回汇总所有不需要的平均分数的结果。
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 0,
"hits": []
},
"aggregations": {
"avg_marks": {
"value": 51.5
}
}
}
我只需要给定文档的平均数学科目,预期结果是56.00
有关查询或想法的任何帮助都将有所帮助。 提前致谢。
首先,您需要在映射中指定索引具有嵌套字段,如下所示:
PUT /nested-index {
"mappings": {
"document": {
"properties": {
"project": {
"type": "nested",
"properties": {
"subject": {
"type": "keyword"
},
"marks": {
"type": "long"
}
}
}
}
}
}
}
然后插入您的文档:
PUT nested-index/document/1
{
"project": [
{
"subject": "maths",
"marks": 47
},
{
"subject": "computers",
"marks": 22
}
]
}
然后插入第二个文档:
PUT nested-index/document/2
{
"project": [
{
"subject": "maths",
"marks": 65
},
{
"subject": "networks",
"marks": 72
}
]
}
然后进行聚合,但指定具有以下嵌套结构:
GET nested-index/_search
{
"size": 0,
"aggs": {
"subjects": {
"nested": {
"path": "project"
},
"aggs": {
"subjects": {
"terms": {
"field": "project.subject",
"size": 10
},
"aggs": {
"average": {
"avg": {
"field": "project.marks"
}
}
}
}
}
}
}
}
以及查询为什么不起作用以及给出该结果的原因是,当您嵌套字段并进行平均时,如果一个数组中的某个关键字并不重要,而您只想按一个主题进行聚合,则对一个数组中的所有数字求和。
因此,如果您拥有这两个文档,因为在这两个文档中您都有数学主题,则avg的计算方式如下:
(47 + 22 + 65 + 72)/ 4 = 51.5
如果您想为网络平均使用agg,它将返回您(因为在一个文档中您具有网络,但是它将对数组中的所有值进行平均):
65 + 72 = 68.5
因此在这种情况下,您需要使用嵌套结构。
如果您只对一个主题感兴趣,那么可以仅对等于这样的主题(主题等于“数学”)进行聚合:
GET nested-index/_search
{
"size": 0,
"aggs": {
"project": {
"nested": {
"path": "project"
},
"aggs": {
"subjects": {
"filter": {
"term": {
"project.subject": "maths"
}
},
"aggs": {
"average": {
"avg": {
"field": "project.marks"
}
}
}
}
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.