合并两个聚合的结果

时间:2019-03-22 10:54:20

标签: elasticsearch

我有一个Elasticsearch索引,其中包含以下字段的文档:

  • 作者
  • 贡献者

这些字段中的每个字段可能包含多个用户ID。

我想执行一个汇总,以计算与每个用户(作为作者或贡献者)相关的文档总数。

我可以分别查询每个聚合,但是如何合并它们呢?这是我的查询:

GET documents/_search
{
  "aggs": {
    "contributor": {
      "terms": {
        "field": "contributor"
      }
    },
    "author": {
      "terms": {
        "field": "author"
      }
    }
  }
}

现在,我得到以下结果:

"aggregations": {
    "author": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [{
                "key": 2,
                "doc_count": 10
            },
            {
                "key": 1,
                "doc_count": 7
            },
            {
                "key": 5,
                "doc_count": 3
            }
        ]
    },
    "contributor": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [{
            "key": 5,
            "doc_count": 1
        }]
    }
}

但是我想进行一次汇总,为用户5返回4个文档的计数。

1 个答案:

答案 0 :(得分:1)

好吧,如果您可以更新您的映射并添加一个字段,那么应该可以。请不要这样可能真的很慢(字符串上的agg太慢,不应过度使用)。请注意,如果同一文档中的author =贡献者,则agg不会计算2次出现(好消息)。

    {
      "mappings": {
        "test": {
          "properties": {
            "contributor": {
              "type": "keyword",
              "copy_to": "author_and_contributor"
            },
            "author": {
              "type": "keyword",
              "copy_to": "author_and_contributor"
            },
            "author_and_contributor": {
              "type": "string",
              "fielddata": true
            }
          }
        }
      }
}

{
  "size": 0,
  "aggs": {
    "author_contrib_agg": {
      "terms": {
        "field": "author_and_contributor"
      }
    }
  }
}