让我用真实的例子来描述我的场景。 我有一个页面,我需要显示按字段排序的公司列表" overallRank"并使用少量过滤器(如companyType和employeeSize)。 现在,很容易从过滤器的ES索引中获取结果,然后按overallRank对它们进行排序。但是,我还想知道所有公司数据中公司的排名,而不仅仅是过滤结果。 例如。亚马逊是美国地区的第三家公司,companyType = Private。但是,如果我们删除companyType过滤器,它是美国第五家公司。在显示过滤器companyType的结果时,我想知道这个整体排名(即第5个)。是否有可能以某种方式在结果中包含此字段?
我目前正在做的是首先通过companyType和位置US获取过滤结果。然后只按位置获取排序结果。第二个查询通过位置的整体排名(亚马逊排在第5位)给出结果。现在我迭代第一个结果,看看该公司在第二个结果中的位置,以确定它的整体排名。 这种方法的问题在于,确定整个公司数据中的总体排名的第二种方法非常昂贵,因为它必须检索大约60k的结果。通过给出批量大小1000,它必须对ES进行大约60次往返,以便将所有结果记录在内存中。它耗费时间和空间。
有人可以建议一个更好的方法吗?
答案 0 :(得分:0)
我认为您可以使用filtered aggregations: 3> top hits aggregation来解决问题
例如,您可以执行以下操作:
{
"aggs": {
"filtered_companies_by_us": {
"filter": {
"term": {
"location": "US"
}
},
"aggs": {
"top_companies": {
"top_hits": {
"sort": [
{
"overallRank": {
"order": "desc"
}
}
],
"size": 5
}
}
}
}
}
}