在子对象/嵌套对象上的Nest(ElasticSearch)中聚合

杰克逊·墨菲

我有一个要在其上计算聚合的产品目录。对于顶级属性(例如品牌名称,制造商等)而言,这足够简单。麻烦在于尝试计算价格范围计数,因为我们以多种货币出售,而在确定这些计数时,我只想查询一种货币时间。这是我的产品对象映射的示例:

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))));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章