弹性搜索:仅聚合特定的嵌套文档

拉克什·阿拉帕蒂

我想聚合满足给定查询的特定嵌套文档。

让我通过一个例子来解释它。我在索引中插入了两条记录:

第一个文件是,

    {
      "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

如果你想要网络的平均值,它会返回你(因为在一个文档中你有网络,但它会对数组中的所有值进行平均值):

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"
                            }
                        }
                    }
                }
            }
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章