Elasticsearch聚合:如何获得术语聚合的“其他”结果?

时间:2019-07-19 06:50:14

标签: elasticsearch elasticsearch-aggregation

我使用聚合从嵌套字段中收集数据,并卡住了一点

文档示例:

{
  ...
  rectangle: {
    attributes: [
      {_id: 'some_id', ...}
    ]
}

ES允许通过rectangular.attributes._id进行分组数据,但是有什么方法可以使一些“其他”存储区放置未添加到任何分组中的文档?也许有一种方法可以创建查询,以{"rectangle.attributes._id": {$ne: "{currentDoc}.rectangle.attributes._id"}}为文档创建存储桶 我认为存储桶将是完美的,因为我需要使用“其他”文档进行进一步的汇总。 也许有一些不错的解决方法

我使用这样的查询进行聚合

"aggs": {
  "attributes": {
    "nested": {
      "path": "rectangle.attributes"
    },
    "aggs": {
      "attributesCount": {
        "cardinality": {
          "field": "rectangle.attributes._id.keyword"
        }
      },
      "entries": {
        "terms": {
          "field": "rectangle.attributes._id.keyword"
        }
      }
    }
  }
}

并获得此结果

"buckets" : [
  {
    "key" : "some_parent_id",
    "doc_count" : 27616,
    "attributes" : {
      "doc_count" : 45,
      "entries" : {
        "doc_count_error_upper_bound" : 0,
        "sum_other_doc_count" : 0,
        "buckets" : [
          {
            "key" : "some_id",
            "doc_count" : 45,
            "attributeOptionsCount" : {
              "value" : 2
            }
          }
        ]
      }
    }
  }
]

这样的结果将是完美的:

"buckets" : [
  {
    "key" : "some_parent_id",
    "doc_count" : 1000,
    "attributes" : {
      "doc_count" : 145,
      "entries" : {
        "doc_count_error_upper_bound" : 0,
        "sum_other_doc_count" : 0,
        "buckets" : [
          {
            "key" : "some_id",
            "doc_count" : 45
          },
          {
            "key" : "other",
            "doc_count" : 100
          }
        ]
      }
    }
  }
]

1 个答案:

答案 0 :(得分:0)

您可以使用missing值参数。更新聚合如下:

"aggs": {
  "attributes": {
    "nested": {
      "path": "rectangle.attributes"
    },
    "aggs": {
      "attributesCount": {
        "cardinality": {
          "field": "rectangle.attributes._id.keyword"
        }
      },
      "entries": {
        "terms": {
          "field": "rectangle.attributes._id.keyword",
          "missing": "other"
        }
      }
    }
  }
}