子域聚合组按弹性搜索顺序排列

时间:2015-01-05 10:47:48

标签: elasticsearch

我无法找到正确的语法来获取由计数字段排序的子对象的聚合。

这方面的一个很好的例子是推特文件:

{
  "properties" : {
    "id" : {
      "type" : "long"
    },
    "message" : {
      "type" : "string"
    },
    "user" : {
      "type" : "object",
      "properties" : {
        "id" : {
          "type" : "long"
        },
        "screenName" : {
          "type" : "string"
        },
        "followers" : {
          "type" : "long"
        }
      }
    }
  }
}

我如何才能获得针对特定推文的最佳影响者?这将是“user.followers”字段排序的前10个“用户”对象的唯一列表。

我尝试过使用top_hits但得到例外:

  

org.elasticsearch.common.breaker.CircuitBreakingException:[FIELDDATA]   数据太大,[user.id]的数据

"aggs": {
    "top-influencers": {
      "terms": {
        "field": "user.id",

        "order": {
          "top_hit": "desc"
        }
      },
      "aggs": {
        "top_tags_hits": {
          "top_hits": {}
        },
        "top_hit": {
          "max": {
            "field": "user.followers"
          }
        }
      }
    }
  }

我可以使用查询中的“排序”字段(无聚合)获得我想要的任何内容,但是如果用户有多个推文,那么它们将在结果中出现两次。我需要能够按子对象“user”进行分组,并且只返回每个用户一次。

--- --- UPDATE

我已经设法获得了一个非常好的时间返回的顶级用户列表。不幸的是,它仍然不是唯一的。另外文档说top_hits被设计成一个子集...,我用它作为顶级聚合...

"aggs": {
    "top_influencers": {
      "top_hits": {
        "sort": [
          {
            "user.followers": {
              "order": "desc"
            }
          }
        ],
        "_source": {
          "include": [
            "user.id",
            "user.screenName",
            "user.followers"
          ]
        },
        "size": 10
      }
    }
  }

1 个答案:

答案 0 :(得分:0)

尝试一下:

{
    "aggs": {
        "GroupByType": {
            "terms": {
                "field": "user.id",
                "size": 10000
            },
            "aggs": {
                "Group": {
                    "top_hits":{
                        "size":1, 
                        "_source": {
                                "includes": ["user.id", "user.screenName", "user.followers"]
                        },
                        "sort":[{
                            "user.followers": {
                                "order": "desc"
                            }
                        }]

                     }
                }
            }
        }
    }
}

然后可以获取此查询的前10个结果。请注意,弹性搜索中的常规搜索最多只能存储10000条记录。