我在弹性搜索索引中有文档类型的产品索引。
这些产品文档有两个十进制值:NormalPrice
、DiscountPrice
。
我想搜索具有NormalPrice > DiscountPrice
的文档。
我试图构建一个这样的查询:
q &= Query<ProductModel>.Range(u => u.Field(f => f.NormalPrice).GreaterThan(u.Field(f => f.DiscountPrice)));
首先,我不确定我的查询是否正确,但如果正确,GreaterThan
函数需要双值。
我该怎么办?有没有其他方法可以与十进制值进行比较?
BTW不能将特性类型更改为双重。我必须使用十进制。
Elasticsearch支持long
、integer
、short
、byte
、double
和float
数字数据类型,因此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; }
}
}
然后对此进行查询。