我有10个具有不同品牌的产品。
Brand1包含3个产品。
Brand2包含4个商品。
Brand3包含3个产品。
目前,我正在根据相关性排序获得输出(如下所示)
{
'id': 1,
'name': 'product1',
'brand': 'brand3',
},{
'id': 3,
'name': 'product3',
'brand': 'brand2',
},{
'id': 13,
'name': 'product3',
'brand': 'brand1',
},{
'id': 2,
'name': 'product4',
'brand': 'brand3',
},{
'id': 5,
'name': 'product5',
'brand': 'brand2',
},{
'id': 9,
'name': 'product6',
'brand': 'brand3',
},{
'id': 17,
'name': 'product7',
'brand': 'brand2',
},{
'id': 20,
'name': 'product12',
'brand': 'brand2',
},{
'id': 23,
'name': 'product15',
'brand': 'brand1',
},{
'id': 7,
'name': 'product10',
'brand': 'brand1',
}
现在,我想要的如下。
根据每个品牌的1个产品,然后每个品牌的下1个产品,依此类推(依以下示例),对产品进行排序。是的,还有一件重要的事情。 我也想在此输出中添加分页。
{
'id': 13,
'name': 'product3',
'brand': 'brand1',
},{
'id': 3,
'name': 'product3',
'brand': 'brand2',
},{
'id': 1,
'name': 'product1',
'brand': 'brand3',
},{
'id': 23,
'name': 'product15',
'brand': 'brand1',
},{
'id': 5,
'name': 'product5',
'brand': 'brand2',
},{
'id': 2,
'name': 'product4',
'brand': 'brand3',
},{
'id': 7,
'name': 'product10',
'brand': 'brand1',
},{
'id': 17,
'name': 'product7',
'brand': 'brand2',
},{
'id': 9,
'name': 'product6',
'brand': 'brand3',
},{
'id': 20,
'name': 'product12',
'brand': 'brand2',
}
最佳答案
一种方法是在“品牌”上使用TermAggregation,然后在第一个聚合上应用另一个subAggregation,此时,在所需字段上使用存储桶排序聚合。
有关更多详细信息,请 checkout 此文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-pipeline-bucket-sort-aggregation.html
编辑:
假设您的数据是这样的:
首先,我们在“品牌”字段上调用termAggregation,因为您要对数据进行分类吗?然后,基于此聚合,我们在第一个聚合上调用另一个子聚合(热门匹配),以更准确的粒度获取所需的数据。所以es dsl应该像这样:
{
"query": {
"query_string": {
"query": "*"
}
},
"aggs": {
"name": {
"terms": {
"field": "brand"
},
"aggs": {
"name": {
"top_hits": {
"sort": [
{
"name": {
"id": "desc"
}
}
]
}
}
}
}
}
}
然后你得到像
为了方便起见,我将大小设置为1,以便为您提供更通用的屏幕截图。您可以从不同“品牌”下的每个存储桶中获取并修改所需的数据。无论您希望将其作为轮询还是其他命令。
对于分页,您可以先从es中获取数据,然后再在自己的代码中执行分页逻辑。如果您的ES中有很多记录,SearchScroll将是一个帮助。搜索一批记录,对其进行汇总,然后滚动到下一批。但是,毕竟,ES更像是搜索引擎,而不是OLTP数据库。由于其基本设计,分页支持受es实现的限制。因此,不要通过ES做任何深度分页!如果您的数据量很大,请小心使用此聚合方法。因为聚合是占用大量CPU的任务,并且如果滥用此类方法,可能会导致OOM并使ES群集崩溃。
关于sorting - 产品按照每个品牌的精选产品进行排序,并相应列出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60558789/