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

Elasticsearch php:具有日期间隔的文档聚合

支洋
2023-03-14

我正试图使用Elasticsearch php 6.0构建一个分面搜索,但我很难想出如何使用日期范围聚合。以下是我想要做的:

映射示例:

"mappings": {
  "_doc": {
    "properties": {
      ...
      "timeframe": {
        "properties": {
          "gte": {
            "type": "date",
            "format": "yyyy"
          },
          "lte": {
            "type": "date",
            "format": "yyyy"
          }
        }
      }
      ...

在我的文档中,我有以下属性:

"timeframe":[{"gte":"1701","lte":"1800"}]

我希望能够使用日期范围滑块显示一个方面,用户可以在其中输入一个范围(最小值-最大值)。理想情况下,给定当前查询,这些最小值-最大值应该由Elasticsearch聚合自动返回。

这是我试图用“伪代码”编写的聚合,给你一个想法:

"aggs": {
  "date_range": {
      "field": "timeframe",
      "format": "yyyy",
      "ranges": [{
          "from": min(timeframe.gte),
          "to": max(timeframe.lte)
      }]
  }
}

我认为我需要使用日期范围聚合、最小/最大聚合和管道聚合,但我读得越多,就越感到困惑。我找不到如何把整个世界粘在一起。

请记住,如果这不是实现此目的的正确方法,我可以更改映射和/或文档结构。

谢谢

共有1个答案

秦新立
2023-03-14

对于我来说,使用ES本身的官方“elasticsearch/elasticsearch”软件包,我能够通过该文档找到我所需的一系列文档。你需要阅读文档,因为你需要格式

$from_date = '2018-03-08T17:58:03Z';
$to_date = '2018-04-08T17:58:03Z';
$params = [
        'index' => 'your_index',
        'type'  => 'your_type',
        'body'  => [
            'query' => [
                'range' => [
                    'my_date_field' => [
                        //gte = great than or equal, lte = less than or equal
                        'gte'    => $from_date,
                        // 'lte'     => $to_date,
                        'format' => "yyyy-MM-dd||yyyy-MM-dd'T'HH:mm:ss'Z'",
                        'boost'  => 2.0
                    ]
                ]
            ],
        ]
    ];
    $search = $client->search($params);
 类似资料:
  • > 每个对象表示一个重复发生的事件。该事件可以在多个日期发生。因此,请考虑以下内容: 我有一个日历在客户端,用户可以选择一个日期范围。 > 对所选日期范围的每个条目进行调用,并在客户端处理聚合。问题是会有大量的读取,因为我们会多次读取重叠的日期范围内的同一个列表对象。 尝试使用类似ElasticSearch/Algolia的服务来完成此操作 任何建议都会很有帮助!

  • 问题内容: 我有两张表。 带有客户和日期的订单表。数据仓库中的日期维度表。 订单表并不包含给定月份中每个日期的活动,但是我需要返回一个填充日期和客户缺口的结果集。 例如,我需要这个: 看起来像这样: 这似乎是一个左外部联接,但它没有返回预期的结果。这是我正在使用的内容,但这并没有按预期返回日期表中的每个日期。 问题答案: 问题是您需要所有日期的所有客户。当您执行时,customer字段将为NULL

  • 问题内容: 我正在管理事件数据库。每个事件都有开始和结束时间戳记()。 目前,我可以通过一个SQL查询执行以下操作: 建立日历,并记下发生事件的日期 列出给定日期(YYYY / MM / DD,YYYY / MM)中发生的事件 问题是当一个事件跨越几天时,我无法在它的开始和结束时间戳之间的日期列出它。 例如: 活动开始于2011/05/25和结束于2011/05/27,但我无法在页面2011/05

  • 以下弹性文件:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-datehistogram-aggregation.html 如何进行日期范围聚合并显示与相关日期段匹配的所有文档,而不是文档计数。 聚合: 回应: 也许我需要做一些子聚合或其他什么? 有什么想法吗?

  • 问题内容: 如何显示mysql中的剩余/互补日期? 例如,在我的表中有2列,其中有一个快照 将给出以下输出: 我希望能够显示我们之间有一个空白并且没有任何记录的日期,如下所示: 这可能吗?谢谢 问题答案: 遵循以下原则: 这意味着:在相邻的结束/开始日期将表与其自身连接,然后计算差异。

  • 系统在数据库中具有以下文档信息: 我已经尝试了使用 mongo java 驱动程序进行重新设置,下面是以下代码片段: 上面为我提供了带有两个元素的ArrayList的输出,第0个元素是带有键“systemName”的Document,值是带有两个元件的Array List。第1个位置元素与键为“systemUsageAttrs”的Document一起,值为ArrayList,包含两个元素,即所有系