sorting - 产品按照每个品牌的精选产品进行排序,并相应列出

标签 sorting elasticsearch

我有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

编辑:
假设您的数据是这样的:enter image description here

首先,我们在“品牌”字段上调用termAggregation,因为您要对数据进行分类吗?然后,基于此聚合,我们在第一个聚合上调用另一个子聚合(热门匹配),以更准确的粒度获取所需的数据。所以es dsl应该像这样:

{
  "query": {
    "query_string": {
      "query": "*"
    }
  },
  "aggs": {
    "name": {
      "terms": {
        "field": "brand"
      },
      "aggs": {
        "name": {
          "top_hits": {
            "sort": [
              {
                "name": {
                  "id": "desc"
                }
              }
            ]
          }
        }
      }
    }
  }
}

然后你得到像
enter image description here

为了方便起见,我将大小设置为1,以便为您提供更通用的屏幕截图。您可以从不同“品牌”下的每个存储桶中获取并修改所需的数据。无论您希望将其作为轮询还是其他命令。

对于分页,您可以先从es中获取数据,然后再在自己的代码中执行分页逻辑。如果您的ES中有很多记录,SearchScroll将是一个帮助。搜索一批记录,对其进行汇总,然后滚动到下一批。但是,毕竟,ES更像是搜索引擎,而不是OLTP数据库。由于其基本设计,分页支持受es实现的限制。因此,不要通过ES做任何深度分页!如果您的数据量很大,请小心使用此聚合方法。因为聚合是占用大量CPU的任务,并且如果滥用此类方法,可能会导致OOM并使ES群集崩溃。

关于sorting - 产品按照每个品牌的精选产品进行排序,并相应列出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60558789/

相关文章:

php - 如何在elasticsearch+PHP中传递null过滤器

javascript - 按子字符串对表格进行排序

java - Java中如何对两个字段进行排序?

c - 如何在合并排序和插入排序之间进行选择?

elasticsearch - 如何在elasticsearch中将一个索引文档复制到另一索引?

docker - Kibana 容器到 elasticsearch 云身份验证错误

arrays - 使用 VBA 将过滤后的行复制到另一个工作表中

javascript - 如何通过嵌套对象属性对对象的已解析 JS 数据进行排序

ruby-on-rails - Ruby on Rails - searchkick gem : cluster_block_exception - FORBIDDEN/12/index read-only/allow delete (api) - status":403

spring-boot - Spring Data Elasticsearch 自定义@Query 超过10个参数