【问题标题】:How to apply aggregations on grouped fields in Elasticsearch?如何在 Elasticsearch 中的分组字段上应用聚合?
【发布时间】:2019-02-04 03:08:18
【问题描述】:

在我的电子商务商店中,我只想在最终结果中包含每个组中的第一项(按 item_id 分组)。同时我不想丢失我的聚合(属性旁边的小数字表示找到了多少具有该属性的项目)。

这是一个小例子:

假设我搜索项目并且只有 25 个出现。这是我目前得到的颜色聚合的结果:


  • 黑色 (65)
  • 绿色 (32)
  • 白色 (13)

我希望它是:


  • 黑色 (14)
  • 绿色 (6)
  • 白色 (5)

数字应该等于用户在页面上实际看到的总数。

如何使用 Elasticsearch 实现这一目标?我已经尝试过分组(热门点击)和字段折叠,但似乎都不适合我的用例。 Solr 几乎默认使用它的 Grouping 功能来做到这一点。

【问题讨论】:

  • 我认为您正在寻找刻面。您需要检查 id 弹性搜索是否具有分面功能...madewithlove.be/faceted-search-using-elasticsearch
  • 是的,因为这是我目前在 Solr 中使用的,但不幸的是,在 Elasticsearch 中,构面已被聚合替换。
  • 好的。我不知道这个...

标签: elasticsearch search solr search-engine


【解决方案1】:

这应该很容易。当您要求聚合时,您只需向_search 端点发送请求。示例:

POST /exams/_search
{
  "aggs" : {
    "avg_grade" : { "avg" : { "field" : "grade" } }
  }
}

在上面的示例中,您将获得所有文档的聚合。

如果您想获得特定文档的聚合,您只需将特定的query 添加到请求正文中,例如:

POST /exams/_search
{
  "query": {
    "bool" : {
      "must" : {
        "query_string" : {
          "query" : "some query string here"
        }
      },
      "filter" : {
        "term" : { "user" : "kimchy" }
      }
    }
  },
  "aggs" : {
    "avg_grade" : { "avg" : { "field" : "grade" } }
  }
}

您也可以发送sizefrom 参数。

【讨论】:

  • 是的,我知道,但我想将颜色、大小、价格等聚合应用于已经折叠的结果。我没有在您的查询中看到结果被分组/折叠的地方。因为如果我折叠字段上的结果,Elasticsearch 在计算聚合时会忽略这些结果。
  • 也许对结果进行分组的唯一方法是在索引之前使用 SQL 对它们进行分组,但这似乎很麻烦,而且有点忽略了重点。但如果这是我必须做的,我会做的。
猜你喜欢
  • 2016-09-24
  • 2021-04-25
  • 2021-12-26
  • 2018-10-05
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
相关资源
最近更新 更多