【问题标题】:Filter by time with any date按时间过滤任何日期
【发布时间】:2020-12-14 18:53:56
【问题描述】:

我只想按时间过滤文档。例如,如果我提供的时间戳如下:7:00:0015:00:00(按 GMT),它们应该返回 15 Dec 202030 April 1340 等日期。

这个查询显然不起作用(我使用 node.js 客户端),因为它返回 1000 年到 3000 年之间的任何日期:

searchResult = await esClient.transport.request({
  method: 'GET',
  path: 'events/_search',
  body: {
    query: {
      bool: {
        must: {
           range: {
             date: {
               gte: '1000-07-15T07:00:00Z',
               lte: '3000-07-15T15:00:00Z'
             }
           }
         }
      }
    },
  }
});

除了这个查询,因为根据this docs,我提供的时间戳(7:00:0015:00:00)被转换为具有默认值的日期:

searchResult = await esClient.transport.request({
  method: 'GET',
  path: 'events/_search',
  body: {
    query: {
      bool: {
        must: {
           range: {
             date: {
               'gte': '7:00:00',
               'lte': '15:00:00',
                format: 'HH:mm:ss'
             }
           }
         }
      }
    },
  }
});

如何仅按时间过滤,而不按天、月、年过滤?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    添加到文档中的“缺少日期组件”部分——如果没有YYYY-MM-DDit'll default to 1970-01-01

    当您想要查询无日期时间范围时,通常会做的是将自当天午夜起经过的时间保存为纯数字值。根据用例的精度需求,它可能是

    这样你就可以得到一个简单的数字range 查询。传入的范围当然需要以符合您存储时间值的方式的格式提供。

    【讨论】:

      【解决方案2】:

      我设法通过存储两个单独的字段来做到这一点:日期strict_date 和时间strict_hour_minute_second

      searchResult = await esClient.transport.request({
        method: 'GET',
        path: 'events/_search',
        body: {
          query: {
              range: {
                time: {
                  gte: '14:20:00',
                  lte: '14:30:00'
                }
              }
            }
        }
      });
      

      【讨论】:

        猜你喜欢
        • 2013-10-20
        • 2021-09-01
        • 2021-12-27
        • 1970-01-01
        • 2018-01-25
        • 2022-07-16
        • 2021-10-09
        • 2023-03-23
        • 2013-07-03
        相关资源
        最近更新 更多