Sorting 产品分类,从每个品牌中挑选产品,并相应列出
我有10种不同品牌的产品。 Brand1包含3种产品。 Brand2包含4种产品。 Brand3包含3种产品 目前,我正在按照相关性排序获得输出(如下示例所示) 现在,我想要的是如下所示。 根据从每个品牌中挑选一个产品,然后从每个品牌中挑选下一个产品,依此类推(根据下面的示例)。是的,还有一件更重要的事我还想将分页添加到此输出。Sorting 产品分类,从每个品牌中挑选产品,并相应列出,sorting,
elasticsearch,Sorting,
elasticsearch,我有10种不同品牌的产品。 Brand1包含3种产品。 Brand2包含4种产品。 Brand3包含3种产品 目前,我正在按照相关性排序获得输出(如下示例所示) 现在,我想要的是如下所示。 根据从每个品牌中挑选一个产品,然后从每个品牌中挑选下一个产品,依此类推(根据下面的示例)。是的,还有一件更重要的事我还想将分页添加到此输出。 { 'id': 13, 'name': 'product3', 'brand': 'brand1', },{ 'id': 3,
{
'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',
}
一种方法是在“brand”上使用TermAggregation,然后在第一个聚合上应用另一个子聚合,此时,在所需字段上使用bucket sort聚合
有关更多详细信息,请签出此文档: 编辑:
假设您的数据是这样的: 首先,我们在字段“brand”上调用术语聚合,因为这个字段是您想要对数据进行分类的字段,对吗?然后基于此聚合,我们在第一个聚合上调用另一个子聚合(top hits聚合),以更精确的粒度获取所需的数据。因此,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群集崩溃。您能给我举个例子吗?我还想添加paginationIt,它以简单聚合的形式为我提供精确的输出。我希望产品输出是一个简单的JSON,如问题中所示。既然你有了聚合,剩下的工作,如JSON对象concats、assembly,我认为,是一个简单的业务逻辑。你在更改映射方面有多大的灵活性,为什么不添加第三个字段,你可以在摄取过程中摄取它并根据它进行排序。我怀疑你想要的是你拥有的地图,你可能想要改变。您想要
any
品牌产品1,然后any
品牌产品2,然后any
品牌产品3,并重复整个场景的排序或理由是什么。我是说那会是随机的吗?每次用户查询时,您的结果是否一致。如果是这样的话,那么必须建立正确的排序顺序。这对我来说没关系。如果它能给我那个品牌的产品。我想在一个特定的位置对品牌进行排序。如果是按顺序或随机顺序,产品订单对我来说是可以的,但是如果我运行相同的过滤器查询,它每次都会给我相同的输出,因为我想在它上面添加分页。
{
"query": {
"query_string": {
"query": "*"
}
},
"aggs": {
"name": {
"terms": {
"field": "brand"
},
"aggs": {
"name": {
"top_hits": {
"sort": [
{
"name": {
"id": "desc"
}
}
]
}
}
}
}
}
}