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

时间:2019-01-26 19:44:37

标签: elasticsearch nest

使用Nest进行ElasticSearch。 enter image description here

索引的一部分看起来像这样“开始日期”:“ 2018-11-01T00:00:00”,“结束日期”:“ 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)
                    )))));

查询运行良好,并返回结果没有过滤器。如上所示添加过滤器后,查询将不返回任何结果。谁能指出fluentAPI代码的问题

1 个答案:

答案 0 :(得分:0)

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

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

在不知道有关响应的更多详细信息的情况下,我怀疑问题是在Elasticsearch服务器端将字符串"2018-08-20"解析为日期时出现问题。 Elasticsearch会尝试使用date字段映射中的StartDate字段映射中指定的格式将字符串解析为日期,并且如果搜索请求中的日期采用其他格式,则可以在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"

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