当前位置: 首页 > 知识库问答 >
问题:

ElasticSearch:如何使用小时范围过滤器查询日期字段

林德惠
2023-03-14

目前,我已经知道如何从(时间戳)日期字段中筛选日期范围。这是一个简单的问题:

"range": {
    "date": {
        "gte": "2015-11-01",
        "lte": "2015-11-30"
    }
}

但是,当你对基于时间的范围感兴趣时,如何过滤日期,比如gte:“8:00:00”和lte:“10:00:00”?这有可能吗?

换句话说,我的要求是:如何让所有事件在本月(15-11-01/15-11-30)发生,但只能在上午8:00到10:00之间发生?

共有3个答案

暴骏奇
2023-03-14

以下是我曾经只从当天开始到下午6点得到的结果:

{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "(log_message:\"My Search String\")"
          }
        },
        {
          "range": {
            "@timestamp": {
              "time_zone": "CET",
              "gt": "now-24h/d",
              "lte": "now-24h/d+18h"
            }
          }
        }
      ]
    }
  }
}

重要的部分是“now-24h/d”,它将轮到午夜/当天开始,尽管这有点棘手,因为它取决于您是否使用gt/lt(e),有关详细信息,请参阅参考文档。

包兴思
2023-03-14

如果我正确理解了您的问题,那么我认为您必须添加新字段,该字段只对时间进行索引

PUT your_index
{
  "mappings": {
    "your_type": {
      "properties": {
        "time": {
          "type":   "date",
          "format": "HH:mm:ss"
        }
      }
    }
  }
}

然后你可以这样查询

{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "date": {
              "gte": "2015-11-01",
              "lte": "2015-11-30"
            }
          }
        },
        {
          "range": {
            "time": {
              "gte": "08:00:00",
              "lte": "10:00:00"
            }
          }
        }
      ]
    }
  }
}

这有用吗?

费学
2023-03-14

您可以使用范围过滤器过滤正确的天数,然后使用脚本过滤器过滤所需的小时数,如下所示:

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "range": {
                "date": {
                  "gte": "2015-11-01",
                  "lte": "2015-11-30"
                }
              }
            },
            {
              "script": {
                "script": {
                  "source": "doc.date.date.getHourOfDay() >= params.min && doc.date.date.getHourOfDay() <= params.max",
                  "params": {
                    "min": 8,
                    "max": 10
                  }
                }
              }
            }
          ]
        }
      }
    }
  }
}

请注意,您需要确保启用动态脚本,以便此查询工作。

 类似资料:
  • 问题内容: 我存储的文档包含两个字段,即startDate和endDate。我想使用输入日期运行Elastic查询,并返回其startDate和endDate包含该日期的所有文档。例如, 如果我输入的日期为2015-01-02,则此文档应出现在结果中,因为输入的日期在开始日期和结束日期字段的范围内。 我可以使用一个字段进行范围查询,但由于范围仅接受一个,因此我不知道如何使用两个日期字段: 我还需要

  • 我正在使用弹性搜索。我以前从未使用过的网络NEST客户端。我想做的是在得分前按日期范围过滤结果。 我使用对象初始值设定项语法,因为它最适合我。 我已经完成了我想要的: 这给了我一个JSON请求,就像我期望的那样: 但留档过滤查询说"弃用在2.0.0-beta1.改为使用bool查询,查询的必须子句和筛选器子句”。 因为这是我发现的唯一包含过滤器的方法,有没有更好的方法来使用嵌套对象初始值设定项语法

  • 问题内容: 我想查询日期范围内的elasticsearch文档。我现在有两个选择,两个都适合我。已经测试了他们两个。1.范围查询2.范围过滤器 由于我现在的数据集很小,因此无法测试它们的性能。两者有什么区别?哪个会导致更快地检索文档和更快地响应? 问题答案: 查询和过滤器之间的主要区别在于评分。查询将返回每个文档具有相对排名得分的文档。过滤器没有。这种差异使过滤器更快,有两个原因。首先,它不会产生

  • 问题内容: 我正在使用Elasticsearch 6.6,尝试根据在日期范围内传递给查询(Bool)的多个值(email_address)提取多个结果/记录。例如:我想根据他们的email_address(annie@test.com,charles@test.com,heman@test.com)以及时期(即project_date(2019-01-01))提取有关少数雇员的信息。 我确实使用了

  • 问题内容: 我在一个模型中有一个领域,例如: 现在,我需要按日期范围过滤对象。 如何过滤日期在和之间的所有对象? 问题答案: 用 或者,如果你只是想按月过滤:

  • 问题内容: 我正在尝试获取IP范围查询以处理一组文档,但是没有任何结果。 映射(我已经尝试了和): 数据看起来像这样(许多实例的值都不同) 现在,我去看了官方的ES文档,但是没有IP范围示例,但是我在Git上找到了一个不起作用的示例。它看起来如下: 当我用手指指住字段和地址时,上面的方法引发了一些令人鼓舞的解析错误,但最终没有返回结果。 我还尝试了标准范围语法: 这也没有返回结果。如何查询一系列I