首页 > 解决方案 > 如何从另一个索引/类型按聚合排序

问题描述

我有一个网上商店,需要按总销售数据进行排序。产品文件示例:

{
    "id": 123,
    "title": "foo product",
    "picture": "https://i.picsum.photos/id/959/200/300.jpghttps://i.picsum.photos/id/959/200/300.jpg"
}

销售文件示例:

{
    "product_id": 123,
    "date": "2020-01-01",
    "sales": 5
},
{
    "product_id": 123,
    "date": "2020-01-02",
    "sales": 6
},
{
    "product_id": 123,
    "date": "2020-01-03",
    "sales": 2
},
{
    "product_id": 123,
    "date": "2020-01-05",
    "sales": 88
}

请注意,没有任何销售的日子不在sales索引/类型中。

现在:

我该如何继续执行此操作?我的背景来自 Solr,我会为此使用流式表达。

更新

我要为此悬赏。我发现这可以通过使用聚合和嵌套来实现。

如果我的数据结构必须为此有所不同,请描述。提前致谢!

标签: elasticsearchelasticsearch-aggregation

解决方案


在 elasticsearch 中连接两个索引是不可能的。

有几个选项:

  1. 加入类型- 但它不是 rdbms 方式

  2. 您可以过滤sales索引并使用产品集合查询query的结果返回sales以获取产品详细信息。

要对缺失值进行排序,您应该使用missing参数。 参考

要获取范围,3to10, more than 30您应该使用 [范围聚合](聚合范围查询弹性搜索)

GET /_search
{
    "aggs" : {
        "sale_ranges" : {
            "range" : {
                "field" : "sales",
                "ranges" : [
                    { "to" : 10 },
                    { "from" : 10, "to" : 20 },
                    { "from" : 20 }
                ]
            }
        }
    }
}

没有销售就无法轻松获得产品。为了得到那个,

  1. 您需要从您的产品表中获取所有产品
  2. 您需要借助上述步骤获取销售表中缺少的产品。

推荐阅读