如何按其他索引/类型的汇总排序

时间:2020-06-26 06:39:47

标签: elasticsearch elasticsearch-aggregation

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

{
    "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索引/类型中。

现在:

  • 我需要过滤在用户定义的时间段内销售额大于/小于X的所有产品(甚至可以过滤销售额= 0)
  • 我需要根据该时间段内的销售额对asc / desc进行排序(升序也意味着它应该从没有销售额的产品开始)。
  • 在该结果中我还需要匹配的产品文档
  • 我还应该能够对产品索引中的其他字段进行排序

我该怎么做?我的背景来自Solr,为此我将使用流表达式。

更新

我将为此悬赏。我发现可以通过使用Aggregations并将其嵌套来实现。

如果我的数据结构必须与此不同,请描述。预先感谢!

1 个答案:

答案 0 :(得分:3)

在弹性搜索中不可能加入两个索引。

有两种选择:

  1. Join type-但这是not rdbms way

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

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

要获取范围,3to10, more than 30应该使用[范围聚合](聚合范围查询elasticsearch)

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

没有销售就无法轻易获得产品。为此,

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