假设我有以下嵌套文档结构,其中我的文档包含带有日期时间值数组的嵌套路由。
{
property_1: ...,
routes: [
{
start_id: 1,
end_id: 2,
execution_times: ['2016-08-28T11:11:47+02:00', ...]
}
]
}
现在我可以使用类似的东西过滤与某些execution_times匹配的文档。
query: {
filtered: {
query: {
match_all: { }
},
filter: {
nested: {
path: 'routes',
filter: {
bool: {
must: [
{
terms: {
'routes.execution_times': ['2016-08-28T11:11:47+02:00', ...]
}
},
...
]
}
}
}
}
}
}
但是如果我想根据执行日期过滤我的文档怎么办?实现这一目标的最佳方法是什么?
我应该使用范围过滤器将日期映射到时间范围吗?
或者使用脚本查询并将execution_times转换为日期更好?
或者是更改文档结构以包含execution_date和execution_time的最佳方法吗?
答案 0 :(得分:0)
<强>更新强>
“日期不是范围,但个别日期如[今天,后天,从现在起4天,从现在起10天]”
嗯,这仍然是一个范围,因为一天意味着24小时。因此,如果您将字段存储为日期时间,则可以使用杠杆范围查询:2010年11月20日00:00:00至2010年11月20日23:59:59,并在特定日期使用适当的时区。
如果将它存储为字符串,那么您将失去日期数学的所有灵活性,并且您将只能进行精确的字符串匹配。然后,您必须在客户端进行所有日期操作,以找到完全匹配和范围。
我建议使用Sense插件播放范围查询,我相信它几乎可以满足您的所有要求。
您应确保为字段使用适当的日期时间映射,并在该字段上使用范围过滤器。您不需要拆分为2个单独的字段。日期数学将允许您仅根据日期进行查询。
如果您想在日期时间字段上进行聚合,这将使您的生活更轻松。
参考:
日期数学: https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#date-math
日期映射:https://www.elastic.co/guide/en/elasticsearch/reference/current/date.html
日期范围查询: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html