elasticsearch - 聚合前 N 个结果

标签 elasticsearch

问题:

如果我搜索“iphone”,我会得到 400 个产品结果,并且我的产品类别聚合会返回结果集中的前 3 个类别。

这些类别包括智能手机、手机壳和手机配件。

如果我搜索“iphone 6”,我会得到 1400 个结果,因为额外的“6”会返回与更多产品的匹配项。产品类别聚合现在返回所有这些结果的前 3 个类别。

前 3 大产品类别现在是从电缆到电脑显示器的所有产品。

我需要做的是获取前 100 个结果的前 3 个类别。


我尝试过的:

我试过在顶级类别聚合中使用 top_hits 聚合,但它只返回每个类别中的顶级产品。

像这样:

{
    "aggs": {

        "product_categories": {
            "terms": {
                "field": "product_category",
                "size": 10,
            }
        }        
        "aggs": {
            "top-categories": {
                "top_hits": {
                    "size" : 3
                }
            }
        }
    }
}

我还尝试创建一个包含子聚合的 top_hits 聚合来获取热门类别,但这也不起作用。

{
    "aggs": {
        "top-categories": {
            "top_hits": {
                "size" : 100
            }
            "aggs": {
                "product_categories": {
                    "terms": {
                        "field": "product_category",
                        "size": 3,
                    }
                }
            }
        }
    }
}

谁能帮我解决这个问题?

最佳答案

您可以尝试使用基于 limit 过滤器的 filter 聚合,并将您的 terms 聚合嵌套在其中。

请注意,该限制适用于分片级别(请参阅 documentation)。

但是,这应该可以解决您的问题,查询如下:

{
  "aggs": {
    "limit_results": {
      "filter": {
        "limit": {
          "value": 100
        }
      },
      "aggs": {
        "product_categories": {
          "terms": {
            "field": "product_category",
            "size": 10
          }
        }
      }
    }
  }
}

关于elasticsearch - 聚合前 N 个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29125532/

相关文章:

elasticsearch - 始终具有和不具有空格的Elasticsearch索引测量单位

ruby-on-rails - Elasticsearch 和轮胎

elasticsearch - 如何在Logstash中键入数据输入

elasticsearch - Elasticsearch -计数api显示索引的总文档计数不正确

其他聚合结果的 elasticsearch min 和 max aggs

php - Elasticsearch 部分批量更新

elasticsearch - 按其他字段中的最佳匹配对结果进行排序

c# - 使用自定义字段进行 Elasticsearch 的 Serilog 配置

elasticsearch - 如何在elasticsearch.yml配置中设置 token 生成器?

php - Laravel 日志系统与 Logstash