如何从elasticsearch查询中获取本周的数据(从本周开始),而不考虑本周?

问题描述 投票:0回答:2

以下是我用来获取过去三个月(月初)数据的查询。如何将其更改为本周的开始?

{
    "size": 10,
    "timeout": "1000s",
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "filter_grouper": "ABC"
                    }
                },
                {
                    "match": {
                        "state": "High"
                    }
                },
                {
                    "range": {
                        "end_date": {
                            "gte": "now-3M/M",
                            "lte": "now"
                        }
                    }
                }
            ]
        }
    },
    "_source": [
        "number",
        "barrel"
    ]
}

我尝试使用

{
    "range": {
         "end_date": {
              "gte": "now/yyyy-W/W",
              "lte": "now"
          }
     }
}

但是它抛出了错误-

{
                "type": "parse_exception",
                "reason": "operator not supported for date math [/yyyy-W/W]"
            }

同样适用于

now-1W/W

elasticsearch
2个回答
0
投票

要在 Elasticsearch 中查询本周的数据(从本周开始),您可以将范围查询与脚本化日期函数结合使用。 Elasticsearch 支持日期数学,这使得动态计算一周的开始变得更容易,无论当前星期如何。

以下是实现它的方法:

  1. 确定本周的开始 可以使用带有
    now/w
    的日期数学来确定本周的开始时间。
  • now
    指当前日期和时间。
  • /w
    调整为一周的开始(Elasticsearch 中默认为星期一)。
  1. 构建查询 使用
    range
    查询根据时间戳过滤文档。例如:
{
  "query": {
    "range": {
      "timestamp_field": {
        "gte": "now/w",
        "lt": "now+1w/w",
        "format": "strict_date_optional_time"
      }
    }
  }
}

说明

  • gte
    (大于或等于):过滤从本周开始的数据。
  • lt
    (小于):排除下周开始的数据,只保留本周的数据。
  • timestamp_field
    :将其替换为文档中日期字段的名称(例如,
    @timestamp
    )。
  1. 定制
  • 如果您的一周从星期一以外的一天开始,请相应地调整您的逻辑。例如,如果一周从星期日开始,您可能需要使用时间偏移来操作
    now
    参数或配置集群的时间设置。
  1. Kibana 开发工具测试 如果您使用 Kibana,请在“开发工具”控制台中测试查询以进行验证:
GET your-index-name/_search
{
  "query": {
    "range": {
      "@timestamp": {
        "gte": "now/w",
        "lt": "now+1w/w",
        "format": "strict_date_optional_time"
      }
    }
  }
}

your-index-name
替换为相关索引名称。

结果 此查询将获取从本周开始到现在的所有文档,无论本周内的当前日期如何。


0
投票

您可以使用下面的查询来获取本周的数据。它将提供从周一(00:00:00.000 小时)到周日(23:59:59.999 小时)的数据。

{
  "size": 10,
  "timeout": "1000s",
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "filter_grouper": "ABC"
          }
        },
        {
          "match": {
            "state": "High"
          }
        },
        {
          "range": {
            "end_date": {
              "gte": "now/w",
              "lte": "now/w"
            }
          }
        }
      ]
    }
  },
  "_source": [
    "number",
    "barrel"
  ]
}

如果您想从周日到周六开始一周,那么您可以更改条件如下:

{
  "range": {
    "end_date": {
      "gte": "now/w-1d",
      "lte": "now/w-1d"
    }
  }
}

您可以在 Kibana 的搜索请求中添加

?explain=true
来查找查询的日期从哪个日期到哪个日期,这将返回毫秒响应,以便您可以在线将毫秒转换为日期并验证它。以下是示例。

POST test/_search?explain=true
{
  "sort": [
    {
      "timestamp": {
        "order": "asc"
      }
    }
  ], 
  "query": {
    "range": {
      "timestamp": {
        "gte": "now/w",
        "lte":"now/w"
      }
    }
  }
}

回应:

{
  "_shard": "[test][0]",
  "_node": "Uy1khygkQweGl25lvrzmvg",
  "_index": "test",
  "_id": "12",
  "_score": null,
  "_source": {
    "user_id": "101",
    "timestamp": "2024-11-18T12:10:30Z",
    "priority": "1"
  },
  "sort": [
    1731931830000
  ],
  "_explanation": {
    "value": 1,
    "description": "timestamp:[1731888000000 TO 1732492799999]",
    "details": []
  }
}

这里,

1731888000000
毫秒表示
Mon Nov 18 2024 00:00:00.000
日期,
1732492799999
表示
Sun Nov 24 2024 23:59:59.999
。希望这对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.