Elasticsearch组和order by嵌套字段的最小值

Elasticsearch组和order by嵌套字段的最小值

问题描述:

我已经得到了它们在不同的商店可提供不同价格的产品结构:Elasticsearch组和order by嵌套字段的最小值

[{ 
    "name": "SomeProduct", 
    "store_prices": [ 
    { 
     "store": "FooStore1", 
     "price": 123.45 
    }, 
    { 
     "store": "FooStore2", 
     "price": 345.67 
    } 
    ] 
},{ 
    "name": "OtherProduct", 
    "store_prices": [ 
    { 
     "store": "FooStore1", 
     "price": 456.78 
    }, 
    { 
     "store": "FooStore2", 
     "price": 234.56 
    } 
    ] 
}] 

我想展示的产品清单,由最低阶价格上升,限制为10个结果,以这样的方式

  • SomeProduct:123.45美元
  • OtherProduct:234.56美元

如何做到这一点?我试着在https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-nested-aggregation.html描述嵌套聚合的方法,但它只返回最小价格的所有产品,而不是各自分钟的价格为每个产品:

{ 
    "_source": [ 
    "name", 
    "store_prices.price" 
    ], 
    "query": { 
    "match_all": {} 
    }, 
    "sort": { 
    "store_prices.price": "asc" 
    }, 
    "aggs": { 
    "stores": { 
     "nested": { 
     "path": "store_prices" 
     }, 
     "aggs": { 
     "min_price": {"min": {"field": "store_prices.price"}} 
     } 
    } 
    }, 
    "from": 0, 
    "size": 10 
} 

在SQL中,我想要做的可以用描述以下查询。我怕,我想得太多了“在SQL”:

SELECT 
    p.name, 
    MIN(s.price) AS price 
FROM 
    products p 
INNER JOIN 
    store_prices s ON s.product_id = p.id 
GROUP BY 
    p.id 
ORDER BY 
    price ASC 
LIMIT 10 
+0

您可以显示迄今为止尝试过的查询吗? – Val

+0

@Val:在问题中更新;基本上,文档中的示例查询。 –

你需要一个nested sorting

{ 
    "query": // HERE YOUR QUERY, 
    "sort": { 
    "store_prices.price": { 
     "order" : "asc", 
     "nested_path" : "store_prices", 
     "nested_filter": { 
      // HERE THE FILTERS WHICH ARE EVENTUALLY 
      // FILTERING OUT SOME OF YOUR STORES 
     } 
    } 
    } 
} 

讲究,你必须重复嵌套过滤器领域内最后的嵌套查询。您会在score字段中找到响应的价格。