在前N个结果上的聚合

Iva*_*var 6 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
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我也尝试创建一个top_hits带有子聚合的聚合来获得最高类别,但这也不起作用.

{
    "aggs": {
        "top-categories": {
            "top_hits": {
                "size" : 100
            }
            "aggs": {
                "product_categories": {
                    "terms": {
                        "field": "product_category",
                        "size": 3,
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我解决这个问题吗?

Tho*_*asC 4

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

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

但是,这应该适合您的情况,查询如下:

{
  "aggs": {
    "limit_results": {
      "filter": {
        "limit": {
          "value": 100
        }
      },
      "aggs": {
        "product_categories": {
          "terms": {
            "field": "product_category",
            "size": 10
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)