我有一个要计算聚合的产品目录。这对于品牌名称、制造商等顶级属性来说已经足够简单了。问题在于尝试计算价格范围计数,因为我们以多种货币销售,而在确定这些计数时,我只想查询一种货币时间。这是我的产品对象映射示例:
public class Product
{
public int ID { get; set;}
public string Name { get; set; }
public IList<Price> Prices { get; set; }
}
public class Price
{
public int CurrencyID { get; set; }
public decimal Cost { get; set; }
}
下面是一个查询所有价格低于 100 的产品的示例:
var cheapProducts = client.Search<Product>(s => s
.From(0)
.Size(1000)
.Query(q => q
.Range(r => r
.LowerOrEquals(100)
.OnField(f => f.Prices.FirstOrDefault().Cost))));
这生成的 ElasticSearch 请求是:
{
"from": 0,
"size": 1000,
"query": {
"range" : {
"prices.cost": {
"lte": "100"
}
}
}
}
如您所料,这将返回任何货币中至少有一个价格低于 100 的所有产品。我一直无法做的是仅针对给定货币的价格运行此查询。例如,将此过滤器添加到查询中只会删除没有货币 1 价格的产品:
var cheapProducts = client.Search<Product>(s => s
.From(0)
.Size(1000)
.Filter(f => f
.Term(t => t
.Prices.FirstOrDefault().CurrencyID, 1))
.Query(q => q
.Range(r => r
.LowerOrEquals(100)
.OnField(f => f.Prices.FirstOrDefault().Cost))));
我尝试将价格列表同时视为嵌套对象和子对象,但 ElasticSearch 似乎没有以这种方式索引价格,因为我收到“AggregationExecutionException[[nested] 嵌套路径 [prices] 是不嵌套]" 和类似的 HasChild 查询。是否可以以这种方式生成查询和聚合?