聚合数组遮挡

时间:2017-03-31 14:11:49

标签: javascript elasticsearch

我有一组文件(帖子),每篇文章都提到了一组用户。

{
    "title": "Some post title",
    [ ... ]
    "mentions": ["johnsmith", "johndoe", "paul"]
}

我想汇总一系列独特的提及,以及所有帖子中提及的次数。例如:

[{ user: "johnsmith", count: 5 }, { user: "benlewis", count: 9 }, { user: "johndoe", count: 1 }]

使用Mongo,我会做类似的事情:

"mentions": [{
    "$unwind": "$mentions"
}, {
    "$group": {
        "_id": "$mentions",
        "count": { "$sum": 1 }
   }
}]

Elasticsearch中的等价物是什么?

1 个答案:

答案 0 :(得分:0)

您可以使用Terms聚合。一个小的(5.x)例子:

PUT test
{
  "mappings": {
    "test" : {
      "properties": {
        "title": {
          "type": "text"
        },
        "mentions": {
          "type": "keyword"
        }
      }
    }
  }
}

POST test/test/1
{
  "title": "Some post title",
  "mentions": [
    "johnsmith",
    "johndoe",
    "paul"
  ]
}

POST test/test/2
{
  "title": "Some post title 2",
  "mentions": [
    "johnsmith"
  ]
}

GET test/_search
{
  "size": 0, 
  "aggs": {
    "test": {
      "terms": {
        "field": "mentions",
        "size": 10
      }
    }
  }
}

给出以下回复:

"aggregations": {
    "test": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "johnsmith",
          "doc_count": 2
        },
        {
          "key": "johndoe",
          "doc_count": 1
        },
        {
          "key": "paul",
          "doc_count": 1
        }
      ]
    }
  }
}

希望这会有所帮助:)