当前位置: 首页 > 知识库问答 >
问题:

Elasticsearch:使用bucket值过滤聚合

阴鸿才
2023-03-14

不知道如何表达这个问题。我正在使用Elasticsearch 2.2。

让我们从数据集的一个示例开始,该数据集由5个文档组成:

[
  {
    "header": {
      "called_entity": { "uuid": "a" },
      "coverage_entity": {},
      "sucessful_transfers": 1
    }
  },
  {
    "header": {
      "called_entity": { "uuid": "a" },
      "coverage_entity": { "uuid": "b" },
      "sucessful_transfers": 1
  }
  },
  {
    "header": {
      "called_entity": { "uuid": "b" },
      "coverage_entity": { "uuid": "a" },
      "sucessful_transfers": 1
    }
  },
  {
    "header": {
      "called_entity": { "uuid": "b" },
      "coverage_entity": { "uuid": "a" },
      "sucessful_transfers": 0
    }
  }
]

被调用的\u实体始终具有uuid。coverage\u实体可以为空,也可以具有uuid。

我使用脚本在任何一个被调用的\实体上进行聚合。uuid或coverage\u实体。uuid:

{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "dim1": {
      "terms": {
        "script" : "return doc['header.called_entity.uuid'] + doc['header.coverage_entity.uuid']",
        "size": 10
      },
      "aggs": {
        "successful_transfers": {
          "sum": {
            "field": "header.successful_transfers"
          }
        }
      }
    }
  }
}

现在,聚合已经从任一头生成了术语。调用了\u实体。uuid或标头。coverage\u实体。uuid。

如何使用聚合键的值筛选聚合?例如,如果我想计算每个bucket的uuid来自标题的文档数量。调用了\u实体。仅uuid。诸如此类:

{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "dim1": {
      "terms": {
        "script" : "return doc['header.called_entity.uuid'] + doc['header.coverage_entity.uuid']",
        "size": 10
      },
      "aggs": {
        "successful_transfers": {
          "sum": {
            "field": "header.successful_transfers"
          }
        },
        "from_called_entity": {
          "filter": {
            "term": { "header.called_entity.uuid": BUCKET_KEY }
          }
        }
      }
    }
  }
}

共有1个答案

狄凯
2023-03-14

不确定这是否可行。键本身只能作为排序选项使用。

你能使用这样的东西吗:

{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "dim1": {
      "terms": {
        "script": "return doc['header.called_entity.uuid'] + doc['header.coverage_entity.uuid']",
        "size": 10
      },
      "aggs": {
        "successful_transfers": {
          "sum": {
            "field": "header.sucessful_transfers"
          }
        }
      }
    },
    "called_entity_source": {
      "terms": {
        "field": "header.called_entity.uuid",
        "size": 10
      }
    },
    "coverage_entity_source": {
      "terms": {
        "field": "header.coverage_entity.uuid",
        "size": 10
      }
    }
  }
}

输出将是这样的:

  "called_entity_source": {
     "doc_count_error_upper_bound": 0,
     "sum_other_doc_count": 0,
     "buckets": [
        {
           "key": "a",
           "doc_count": 2
        },
        {
           "key": "b",
           "doc_count": 2
        }
     ]
  },
  "coverage_entity_source": {
     "doc_count_error_upper_bound": 0,
     "sum_other_doc_count": 0,
     "buckets": [
        {
           "key": "a",
           "doc_count": 2
        },
        {
           "key": "b",
           "doc_count": 1
        }
     ]
  },
  "dim1": {
     "doc_count_error_upper_bound": 0,
     "sum_other_doc_count": 0,
     "buckets": [
        {
           "key": "a",
           "doc_count": 4,
           "successful_transfers": {
              "value": 3
           }
        },
        {
           "key": "b",
           "doc_count": 3,
           "successful_transfers": {
              "value": 2
           }
        }
     ]
  }

如果您确实需要以这种特定的方式拥有json,请在您的应用程序中添加另一个最后一步,您可以在其中发布一些处理结果的步骤。上面的结果确实包含您需要的信息,但是来自coverage_entity_sourcecalled_entity_source的键不在dim聚合下。

 类似资料:
  • 我有一个Elasticsearch文档索引,其中有一个包含URL列表的字段。如预期的那样,在该字段上聚合会给我唯一URL的计数。 然后,我想过滤掉其键不包含特定字符串的桶。我已经尝试使用Bucket选择器聚合来实现这一点。 此尝试: 失败原因: 名为[links\u key\u filter]且类型为[bucket\u selector]的管道聚合无效。顶层仅允许同级管道聚合 将bucket选择器

  • 问题内容: 我要实现的目标:我不希望查询过滤器过滤“年龄”聚合,并且希望能够对其应用过滤器。 因此,如果我从以下查询开始: 我的聚合“ young_age”将同时被filter_1和filter_2过滤。我不希望我的汇总被filter_1过滤。 在查看文档时,我认为全局聚合可以解决我的问题,因此我编写了以下查询: 但是然后elasticsearch抱怨我的filter_2: “”“在[global

  • 我有一个返回一组文档(100)的查询。我想对这些应用一个聚合,因为这些是最相关的。当我尝试聚合时,它返回所有结果的聚合,而不是前100个结果的聚合。

  • 以下是数据集的快照: 我想获得员工名单以及employeeStatus和employeeAddr。 所以我在employeeId上使用术语聚合,然后使用employeeStatus和employeeAddr的子聚合来获得这些详细信息。下面的查询正确返回结果。 现在我只想要永久身份的员工。所以我正在应用过滤器聚合。 现在的问题是雇员地址聚合没有为雇员地址返回存储桶,因为记录2在聚合完成之前就被过滤掉

  • 问题内容: 我正在尝试对数组中的值进行聚合,并且还过滤由前缀返回的存储桶。不知道这是否可行,或者我滥用过滤桶。 3份文件: 目的是获取带有字母B开头颜色的文档数量: 不幸的是,返回的结果包括Red。显然是因为带有红色的文档仍然按过滤器匹配,因为它们也具有蓝色和/或黑色。 有没有一种方法可以只过滤存储桶结果? 问题答案: 尝试此操作,它将过滤为存储桶本身创建的值:

  • 问题内容: 我想过滤出字段“ A”等于“ a”的文档,并且我想同时考虑字段“ A”,当然不包括先前的过滤器。我知道您可以将过滤器“置于查询之外”,以便在不应用该过滤器的情况下获得构面,例如: elasticsearch 单反 这非常好,但是如果我有多个滤镜和构面,每个滤镜和构面应该互相排斥,会发生什么?例: 也就是说,对于方面AI,希望保留除A:a以外的所有过滤器,对于方面B希望保留除B:b以外的