elasticsearch根据日期时间字段过滤日期

时间:2016-08-28 09:24:29

标签: date datetime elasticsearch

假设我有以下嵌套文档结构,其中我的文档包含带有日期时间值数组的嵌套路由。

     {
       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的最佳方法吗?

1 个答案:

答案 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

相关问题