Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 产品分类,从每个品牌中挑选产品,并相应列出_Sorting_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch - Fatal编程技术网 elasticsearch,Sorting,elasticsearch" /> elasticsearch,Sorting,elasticsearch" />

Sorting 产品分类,从每个品牌中挑选产品,并相应列出

Sorting 产品分类,从每个品牌中挑选产品,并相应列出,sorting,elasticsearch,Sorting,elasticsearch,我有10种不同品牌的产品。 Brand1包含3种产品。 Brand2包含4种产品。 Brand3包含3种产品 目前,我正在按照相关性排序获得输出(如下示例所示) 现在,我想要的是如下所示。 根据从每个品牌中挑选一个产品,然后从每个品牌中挑选下一个产品,依此类推(根据下面的示例)。是的,还有一件更重要的事我还想将分页添加到此输出。 { 'id': 13, 'name': 'product3', 'brand': 'brand1', },{ 'id': 3,

我有10种不同品牌的产品。 Brand1包含3种产品。 Brand2包含4种产品。 Brand3包含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"
                }
              }
            ]
          }
        }
      }
    }
  }
}