如何使用 Nest 比较 Elasticsearch 查询中文档的两个属性的十进制值?

How to compare decimal values of two properties of a document in an Elasticsearch query with Nest?

我在 elasticsearch 索引中输入了产品索引的文档。

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

我想搜索包含 NormalPrice > DiscountPrice.

的文档

我尝试构建这样的查询:

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

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

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

顺便说一句,将 属性 类型更改为 double 不是一个选项。我必须使用小数。

Elasticsearch supports long, integer, short, byte, double and float numeric data types,因此 NEST 默认将 decimal 类型映射到 double

要执行跨文档字段的比较,可以使用 script query

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

然后查询。