弹性搜索日期范围过滤器 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 将尝试使用 StartDate
的 date
字段映射中指定的格式将字符串解析为日期,如果搜索请求中的日期采用不同的格式,您可以在中提供格式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"
与索引中的字段格式相同。或者,您可以传递此格式的字符串。
将 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 将尝试使用 StartDate
的 date
字段映射中指定的格式将字符串解析为日期,如果搜索请求中的日期采用不同的格式,您可以在中提供格式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"
与索引中的字段格式相同。或者,您可以传递此格式的字符串。