首页 > 解决方案 > 管道桶选择器不适用于嵌套对象

问题描述

我想获取嵌套对象的聚合,然后按这些聚合的结果进行过滤。我尝试过使用bucket_selector,但 ES 向我抛出以下错误:

{
  "error" : {
    "root_cause" : [ ],
    "type" : "search_phase_execution_exception",
    "reason" : "",
    "phase" : "fetch",
    "grouped" : true,
    "failed_shards" : [ ],
    "caused_by" : {
      "type" : "class_cast_exception",
      "reason" : "class org.elasticsearch.search.aggregations.bucket.nested.InternalNested cannot be cast to class org.elasticsearch.search.aggregations.InternalMultiBucketAggregation (org.elasticsearch.search.aggregations.bucket.nested.InternalNested and org.elasticsearch.search.aggregations.InternalMultiBucketAggregation are in unnamed module of loader 'app')"
    }
  },
  "status" : 500
}

这是我的模拟数据索引:

PUT /creature
{
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
      "name": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      },
      "creature_deed": {
        "type": "nested",
        "properties": {
          "id": {
            "type": "keyword"
          },
          "deed_type": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

PUT /creature/_doc/1
{
  "id": "1",
  "name": "alpha",
  "creature_deed": [
    {
      "id": 1,
      "deed_type": "GET_TYPE"
    },
    {
      "id": 2,
      "deed_type": "GET_TYPE"
    }
  ]
}

PUT /creature/_doc/2
{
  "id": 2,
  "name": "beta",
  "creature_deed": [
    {
      "id": 1,
      "deed_type": "GET_TYPE"
    },
    {
      "id": 2,
      "deed_type": "GET_TYPE"
    },
    {
      "id": 3,
      "deed_type": "GET_TYPE"
    }
  ]
}

PUT /creature/_doc/3
{
  "id": 3,
  "name": "gamma",
  "creature_deed": [
    {
      "id": 1,
      "deed_type": "GITTEN_TYPE"
    },
    {
      "id": 2,
      "deed_type": "GET_TYPE"
    }
  ]
}

这是我的实际查询:

GET creature/_search
{
  "size": 0, 
  "aggs": {
    "creatures": {
      "terms": {
        "field": "name.keyword"
      },
      "aggs": {
        "creature_deed": {
          "nested": {
            "path": "creature_deed"
          },
          "aggs": {
            "creature_get_count": {
              "terms": {
                "field": "creature_deed.deed_type"
              }
            },
            "creature_get_count_filtered": {
              "bucket_selector": {
                "buckets_path": {
                  "creatureGetCount": "creature_get_count"
                },
                "script": "params.creatureGetCount > 2"
              }
            }
          }
        }
      }
    }
  }
}

弹性搜索版本:docker.elastic.co/elasticsearch/elasticsearch:7.13.0

Kibana 版本:docker.elastic.co/kibana/kibana:7.13.0

标签: elasticsearch

解决方案


推荐阅读