如何在C#中为Elasticsearch日期范围查询添加字段天数偏移
问题根因
普通DateRange查询仅支持固定值或基于now的相对时间计算,无法直接引用同文档内的其他字段作为运算基准,因此你尝试的直接填写doc.RegisterDate+30d/d的写法不生效。
正确实现方案
需要使用Elasticsearch内置的Painless脚本查询实现跨字段日期对比,对应的C# ElasticClient(NEST)写法如下:
var client = new ElasticClient(); var searchResponse = client.Search<MyDocument>(s => s .Query(q => q .Script(sc => sc .Script(sd => sd // 逻辑:expireDate >= registerDate + 30天 .Source("!doc['expireDate'].value.isBefore(doc['registerDate'].value.plusDays(30))") // 若需要忽略时分秒,按自然日计算,使用以下写法 // .Source("!doc['expireDate'].value.toLocalDate().isBefore(doc['registerDate'].value.toLocalDate().plusDays(30))") ) ) ) );
注意事项
- 注意检查字段拼写,你示例代码中的
ExipreDate为拼写错误,正确应为ExpireDate,避免字段映射不匹配 - 需保证ES索引中
expireDate和registerDate字段的Mapping为日期类型(date),否则无法调用日期运算方法 - 脚本中的字段名需和ES索引中的实际字段名完全匹配,若你使用NEST默认驼峰映射,C#的
RegisterDate属性对应ES的registerDate字段,若自定义了字段映射请对应修改 - 若文档存在两个字段为空的情况,可添加判空逻辑避免查询报错,示例脚本如下:
doc.containsKey('expireDate') && doc.containsKey('registerDate') && !doc['expireDate'].value.isBefore(doc['registerDate'].value.plusDays(30))
内容的提问来源于stack exchange,提问作者Aviel Palgi
相关产品推荐
相关产品推荐

