Rails弹性搜索聚合

时间:2014-07-27 13:16:06

标签: ruby ruby-on-rails-4 elasticsearch

不知怎的,我似乎无法得到包含我的聚合的回复......

使用curl按预期工作:

HBZUMB01$ curl -XPOST "http://localhost:9200/contents/_search" -d '{
  "size": 0,
  "aggs": {
    "sport_count": {
      "value_count": {
        "field": "dwid"
      }
    }
  }
}'

我收到回复:

{
  "took": 4,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 90,
    "max_score": 0.0,
    "hits": []
  },
  "aggregations": {
    "sport_count": {
      "value": 399
    }
  }
}

但是使用rails中的代码:

query = '{
  "size": 0,
  "aggs": {
    "sport_count": {
      "value_count": {
        "field": "dwid"
      }
    }
  }
}'
@response = Content.search(query).to_json

并在浏览器中呈现

respond_to do |format|
  format.html do    
  render text: "#{@response}"   
end

我得到一个空的回复:

[  ]

如何在这里打印我的卷轴?

1 个答案:

答案 0 :(得分:13)

我也在努力解决这个问题,但现在我发现了如何获得聚合结果。

如果您将 elasticsearch-rails elasticsearch-model gems一起使用,那么当您在模型上运行聚合时,您可以获得像这个例子:

 agg = Model.search( 
     query: { match: { param: 'value' } }, 
     aggs: {my_aggregation_name: { terms: { field: :my_field} }} 
 )

在您的RoR代码中:

agg.response["aggregations"]["my_aggregation_name"]["buckets"]

由此,您将获得如下结果:

[{"key"=>"banana",
  "doc_count"=>1963,
  "score"=>478.30920868573355,
  "bg_count"=>2152},
 {"key"=>"potato",
  "doc_count"=>1212,
  "score"=>315.68857496078505,
  "bg_count"=>1243}, ...]

然后你可以做任何你想做的事!希望有所帮助!