反向嵌套后无法重新嵌套在同一个字段上

时间:2014-07-25 15:23:16

标签: elasticsearch aggregate

我在嵌套字段上执行某个聚合时遇到问题。

我有一个嵌套类型的字段,它包含一个对象数组。我想做的是:

在字段上聚合以查找包含特定值的所有嵌套文档,然后反向嵌套回根,向我提供具有我正在寻找的嵌套字段对象的整个根文档集。

然后,针对相同的嵌套字段进一步聚合该组文档,这次针对不同的值。

目的是建立一个类似于漏斗的东西,我会根据嵌套的字段,使用越来越多的标准缩小聚合范围。

似乎发生的事情是,当执行我的第二个嵌套的agg时,它本身带有嵌套的> reverse_nested agg,看起来好像它再也看不到任何嵌套字段了。如果您运行这个简单的CURL,请查看' into_nested_again'的值。它是0,但它应该是3,就像原始' into_nested'的价值一样。 AGG。我想我可以通过构建完全独立的聚合和AND过滤器来解决这个问题,但是它会更加干净并且难以解析。这是一个错误还是我错过了什么?

curl -XDELETE "http://localhost:9200/nested-test"

curl -XPUT "http://localhost:9200/nested-test" -d'
{
  "mappings": {
    "my_type": {
      "properties": {
        "my_nested_field": {
          "type": "nested"
       }
      } 

    }
  }
}'

curl -XPOST "http://localhost:9200/nested-test/my_type" -d'
{
  "my_nested_field" : [
    {
      "my_key": "value1"
    }
  ]
}'

curl -XPOST "http://localhost:9200/nested-test/my_type" -d'
{
  "my_nested_field" : [
    {
      "my_key": "value1"
    },
    {
      "my_key": "value2"
    }
  ]
}'

curl -XGET "http://localhost:9200/nested-test/_search" -d'
{
  "aggs": {
    "into_nested": {
      "nested": {
        "path": "my_nested_field"
      },
      "aggs": {
        "by_value1": {
          "filter": {
            "term": {
              "my_nested_field.my_key": "value1"
            }
          },
          "aggs": {
            "by_parent": {
              "reverse_nested": {}
              , "aggs": {
                "into_nested_again": {
                  "nested": {
                    "path": "my_nested_field"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}'

1 个答案:

答案 0 :(得分:1)

我想我正在接近这个错误。而不是使用'嵌套'作为更高级别的agg,如果我从过滤器开始,然后在其中放置嵌套的agg,我得到预期的结果:

curl -XGET "http://localhost:9200/nested-test/_search" -d'
{
  "aggs": {
    "by_value1": {
      "filter": {
        "nested": {
          "path": "my_nested_field",
          "filter": {
            "term": {
              "my_nested_field.my_key": "value1"
            }
          }
        }
      },
        "aggs": {
          "by_value2": {
            "filter": {
              "nested": {
                "path": "my_nested_field",
                "filter": {
                  "term": {
                    "my_nested_field.my_key": "value2"
                  }
                }
              }
            }
        }
      }
    }
  }
}'