gpt4 book ai didi

c# - 在 Nest (ElasticSearch) 中聚合子/嵌套对象

转载 作者:太空狗 更新时间:2023-10-29 21:50:00 25 4
gpt4 key购买 nike

我有一个产品目录,我想对其进行汇总计算。这对于顶级属性(例如品牌名称、制造商等)来说已经足够简单了。尝试计算价格的范围计数会带来麻烦,因为我们以多种货币销售,而在确定这些计数时,我只想查询一种货币时间。这是我的产品对象映射的示例:

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 查询。是否可以通过这种方式生成查询和聚合?

最佳答案

首先你需要映射嵌套类型:

 public class Product
{
public int ID { get; set; }
public string Name { get; set; }
[ElasticProperty(Type = FieldType.Nested)]
public IList<Price> Prices { get; set; }
}

之后,尝试执行这个查询:

 var cheapProducts = client.Search<Product>(s => s
.From(0)
.Size(1000)
.Query(x => x.Term(p => p
.Prices.First().CurrencyID, 1) && x.Range(r => r
.LowerOrEquals(100)
.OnField(f => f.Prices.FirstOrDefault().Cost))));

关于c# - 在 Nest (ElasticSearch) 中聚合子/嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27508766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com