【问题标题】:Rails elasticsearch aggregationRails 弹性搜索聚合
【发布时间】:2023-03-18 03:04:01
【问题描述】:

不知何故,我似乎无法获得包含我的聚合的响应...

使用 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

我得到一个空响应:

[  ]

如何在此处打印我使用 curl 获得的聚合?

【问题讨论】:

  • 您用于集成 Elasticsearch 的 gem 是什么?

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


【解决方案1】:

我也在为此苦苦挣扎,但现在我发现了如何获得聚合结果。

如果您将 elasticsearch-railselasticsearch-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}, ...]

然后你就可以为所欲为!希望对您有所帮助!

【讨论】:

  • 我使用的是 ElasticSearch 2.x,上面的大部分对我有用,但我需要做agg.response.aggregations.my_aggregation_name.buckets。 “哈希格式”对我不起作用。此外,如果您只想返回计数,可以将search_type: 'count' 作为第二个参数传递给Model#search
  • 我认为这与 ES 版本无关,而与 es-rails 和 es-model 版本有关。对我来说,Model.search 返回 Hashie::Mash 对象,所以这两种语法都可以正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 2019-11-08
  • 2021-02-19
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多