如何使用 Nest 比较 Elasticsearch 查询中文档的两个属性的十进制值?
How to compare decimal values of two properties of a document in an Elasticsearch query with Nest?
我在 elasticsearch 索引中输入了产品索引的文档。
这些产品文档有 2 个十进制值:NormalPrice
、DiscountPrice
。
我想搜索包含 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; }
}
}
然后查询。
我在 elasticsearch 索引中输入了产品索引的文档。
这些产品文档有 2 个十进制值:NormalPrice
、DiscountPrice
。
我想搜索包含 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; }
}
}
然后查询。