【问题标题】:Elasticsearch: filter aggregation using bucket valueElasticsearch:使用桶值过滤聚合
【发布时间】:2016-12-04 06:03:38
【问题描述】:

不确定如何提出问题。 我正在使用 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
    }
  }
]

called_entity 总是有一个 uuidcoverage_entity 可以为空,或具有 uuid

我使用脚本在 called_entity.uuidcoverage_entity.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"
          }
        }
      }
    }
  }
}

所以现在,聚合已从 header.called_entity.uuidheader.coverage_entity.uuid 生成术语。

如何使用聚合键的值过滤我的聚合?例如,如果我想计算,对于每个桶,有多少文档的 uuid 仅取自 header.called_entity.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 }
          }
        }
      }
    }
  }
}

【问题讨论】:

    标签: elasticsearch elasticsearch-aggregation


    【解决方案1】:

    不确定这是否可能。键本身仅可用作排序选项。

    你能用这样的东西吗:

    {
      "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 的响应后,我在服务器端合并了两个聚合)。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2018-09-14
    • 2017-04-15
    • 2014-09-18
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多