弹性搜索日期范围过滤器 lambda 表达式问题

Elastic Search Date Range Filter lambda expression issue

将 Nest 用于 ElasticSearch。 enter image description here

部分索引如下所示 "startdate":“2018-11-01T00:00:00”,"enddate":“2018-11-01T00:00:00” 我的 FluentAPI 查询如下所示

 var response = client.Search<ActivityReportsSearchViewModel>(x => x
                    .Size(500)
                    .Query(q => q.Bool(b => b.Must
                    (mu => mu.MultiMatch(m => m
                        .Fields(n => n.Fields(f => f.User, f => f.Activity
                            , f => f.County, f => f.Constituency, f => f.Country
                            , f => f.ActivityRequestDescription, f => f.ActivityDescription,
                            f => f.LessonsLearnt, f => f.Challenges, f => f.Recommendatinons, f => f.User
                            , f => f.Venue, f => f.Division))
                        .Query(**search**)))
                .**Filter**(fi => fi
                    .DateRange(r => r
                        .Field(f => f.StartDate)
                        .GreaterThan("2018-08-20")
                        .LessThanOrEquals(DateMath.Now)
                    )))));

查询运行良好,return 结果 WITHOUT 过滤器。如上所示添加过滤器后,查询 returns 没有结果。谁能指出 fluentAPI 代码的问题

您可以检查 response.IsValid 以确定请求对 API 对 Elasticsearch 的调用是否有效。

response.DebugInformation 将以易于阅读的格式提供有关 API 调用的更多详细信息,包括是否存在错误。如果是 Elasticsearch 中的错误,response.ServerError 将填充详细信息。

在不知道有关响应的更多详细信息的情况下,我怀疑问题是在 Elasticsearch 服务器端将字符串 "2018-08-20" 解析为日期时出现的问题。 Elasticsearch 将尝试使用 StartDatedate 字段映射中指定的格式将字符串解析为日期,如果搜索请求中的日期采用不同的格式,您可以在中提供格式DateRange query with .Format(...).

假设文档最初是用 .NET 客户端索引的,并且使用了默认的 DateTime 序列化,您应该能够使用 DateTime 的实例来提供所需的日期

.DateRange(r => r
    .Field(f => f.StartDate)
    .GreaterThan(new DateTime(2018, 8, 20))
    .LessThanOrEquals(DateMath.Now)
)

这将序列化为

"2018-08-20T00:00:00"

与索引中的字段格式相同。或者,您可以传递此格式的字符串。