使用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代码的问题
答案 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"
,其格式与索引中的字段相同。或者,您可以以这种格式传递字符串。