如何在带有Nest的Elasticsearch查询中比较文档的两个属性的十进制值



我在弹性搜索索引中有文档类型的产品索引。

这些产品文档有两个十进制值:NormalPriceDiscountPrice

我想搜索具有NormalPrice > DiscountPrice的文档。

我试图构建一个这样的查询:

q &= Query<ProductModel>.Range(u => u.Field(f => f.NormalPrice).GreaterThan(u.Field(f => f.DiscountPrice)));

首先,我不确定我的查询是否正确,但如果正确,GreaterThan函数需要双值。

我该怎么办?有没有其他方法可以与十进制值进行比较?

BTW不能将特性类型更改为双重。我必须使用十进制。

Elasticsearch支持longintegershortbytedoublefloat数字数据类型,因此NEST默认情况下会将decimal类型映射到double

使用script查询可以实现跨文档字段的比较

client.Search<ProductModel>(s => s
    .Query(q => q
        .Script(sn => sn
            .Inline("doc['normalPrice'].value > doc['discountPrice'].value")
        )
    )
);

请记住,script查询可能很昂贵,而且可能比其他查询慢得多,这取决于您正在做什么。如果这是一个需要大量运行的查询,您可以考虑将比较存储为文档中的布尔字段,并将其设置为ProductModel类型上的属性

public class ProductModel
{
    public decimal NormalPrice { get; set:}
    public decimal DiscountPrice { get; set:}
    public bool NormalPriceGreaterThanDiscountPrice 
    { 
        get { return NormalPrice > DiscountPrice; } 
    }
}

然后对此进行查询。

最新更新