使用Nest 6.x

时间:2018-09-10 22:13:57

标签: c# elasticsearch nest

全部,     我正在研究一个Nest 6.x查询,该查询在Elastic搜索的日期字段上生成流动的DSL。 Nest API仅在日期字段中为GreaterThanOrEquals()提供一个双精度值。如何将现在产生30d / d的DateMath类型转换为double?请在下面查看我的代码

查询DSL

{
    "range": {
        "agreementCancelDate": {
            "gte": "now-30d/d"
        }
    }
}

f.Range(r => r.Field("agreementCancelDate").GreaterThanOrEquals(d))
上面的

d必须是now-30d / d的双值表示形式。

我正在使用以下代码使用Nest.DateMath API创建now-30d / d

var aMonthBack = Nest.DateMath.Now.Subtract("30d").RoundTo(DateMathTimeUnit.Day);

较旧版本的NEST(1.7x)允许我输入一个字符串值,例如“ now-30d / d”,但是6.x只接受一个双精度值

在上面的Nest代码中,f是QueryContainerDescriptor

1 个答案:

答案 0 :(得分:1)

a range query on DateTime or DateTimeOffset属性的约束接受一个DateMath参数,该参数具有一个string的隐式转换

public class MyDocument 
{
    public DateTime AgreementCancelDate { get; set; }
}

var client = new ElasticClient();

client.Search<MyDocument>(s => s
    .Query(q => q
        .DateRange(dr => dr
            .Field(f => f.AgreementCancelDate)
            .GreaterThanOrEquals("now-30d/d")
        )
    )
);

产生请求的

{
  "query": {
    "range": {
      "agreementCancelDate": {
        "gte": "now-30d/d"
      }
    }
  }
}