Jac*_*rph 6 .net c# aggregates elasticsearch nest
我有一个我想要计算聚合的产品目录.这对于顶级属性(如品牌名称,制造商等)来说非常简单.尝试计算价格的范围计数时会出现问题,因为我们以多种货币进行销售,而在确定这些计数时,我只想查询一种货币.时间.以下是我的产品对象映射示例:
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; }
}
Run Code Online (Sandbox Code Playgroud)
以下是价格低于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))));
Run Code Online (Sandbox Code Playgroud)
这会生成的ElasticSearch请求是:
{
"from": 0,
"size": 1000,
"query": {
"range" : {
"prices.cost": {
"lte": "100"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如您所料,这将以任何货币返回至少一个价格低于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))));
Run Code Online (Sandbox Code Playgroud)
我已经尝试将价格列表视为嵌套对象和子对象,但ElasticSearch似乎没有以这种方式索引价格,因为我收到错误"AggregationExecutionException [[嵌套]嵌套路径[价格]是不嵌套]"和HasChild查询类似.是否可以以这种方式生成查询和聚合?
首先,您需要映射嵌套类型:
public class Product
{
public int ID { get; set; }
public string Name { get; set; }
[ElasticProperty(Type = FieldType.Nested)]
public IList<Price> Prices { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
之后,尝试执行此查询:
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))));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2319 次 |
| 最近记录: |