【问题标题】:Elastic search date range aggregation弹性搜索日期范围聚合
【发布时间】:2014-09-25 11:16:22
【问题描述】:

我有一个 Json 数据

"hits": [
         {
            "_index": "outboxprov1",
            "_type": "deleted-connector",
            "_id": "AHkuN5_iRGO-R5dtaOvz6w",
            "_score": 1,
            "_source": {
               "user_id": "1a9d05586a8dc3f29b4c8147997391f9",
               "deleted_date": "2014-08-02T04:55:04.509Z"
            }
         },
         {
            "_index": "outboxprov1",
            "_type": "deleted-connector",
            "_id": "Busk7MDFQ4emtL3x5AQyZA",
            "_score": 1,
            "_source": {
               "user_id": "1a9d05586a8dc3f29b4c8147997391f9",
               "deleted_date": "2014-08-02T04:58:31.440Z"
            }
         },
         {
            "_index": "outboxprov1",
            "_type": "deleted-connector",
            "_id": "4AN0zKe9SaSF1trz1IixfA",
            "_score": 1,
            "_source": {
               "user_id": "1a9d05586a8dc3f29b4c8147997391f9",
               "deleted_date": "2014-07-02T04:53:07.010Z"
            }
         }
]

我正在尝试编写聚合查询,它将查找特定“deleted_date”范围内的记录。 这是我的查询

{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "daily_team": {
      "date_range": {
        "field": "deleted_date",
         "format": "YYYY-MM-DD",
        "ranges": [
          {
            "from": "2014-08-02"
          },
          {
            "to": "2014-08-02"
          }
        ]
      },
      "aggs": {
        "daily_team_count": {
          "terms": {
            "field": "user_id"
          }
        }
      }
    }
  }
}

我的问题是在特定日期范围内没有获得正确数量的记录。当我输入任何日期时,我都会得到一些 doc_count 号码。我是弹性搜索的新手。我不确定它是否是编写范围聚合查询的方式。请帮我解决这个问题。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    OP 正在寻找的是InternalDateRange 查询。试试这个:

     {
      "size": 0,
      "query": {
        "match_all": {}
      },
      "aggs": {
        "daily_team": {
          "date_range": {
            "field": "deleted_date",
            "format": "YYYY-MM-DD",
            "ranges": [
              {
                "from": "2014-08-02||/d",   // /d rounds off to day
                                            // from value -> 2014-08-02T00:00:00.000Z
                "to": "2014-08-03||/d"      // to value -> 2014-08-03T00:00:00.000Z
              }
            ]
          },
          "aggs": {
            "daily_team_count": {
              "terms": {
                "field": "user_id"
              }
            }
          }
        }
      }
    }
    

    这将返回名为 daily_team 的单个存储桶中的匹配结果计数。

    "buckets": [
               {
                  "key": "2014-08-02T00:00:00.000Z-2014-08-03T00:00:00.000Z",
                  "from": 1470096000000,    //test data value
                  "from_as_string": "2014-08-02T00:00:00.000Z",
                  "to": 1470182400000,      //test data value
                  "to_as_string": "2014-08-03T00:00:00.000Z",
                  "doc_count": 0
               }
            ]
    

    这将返回包含匹配 doc_count 的单个存储桶。

    "ranges": [
          {
            "from": "2014-08-02"
          },
          {
            "to": "2014-08-02"                
          }
    

    使用上述范围将返回 2 个桶,fromto 日期范围各一个。

    from -> 2014-08-02-* to -> *-2014-08-02official documentation page 所示。

    【讨论】:

      【解决方案2】:

      我认为问题是您对日期范围聚合的“从”和“到”以及范围过滤器感到困惑。范围过滤器默认包括日期(从和到)。但在 date_range 聚合中,包括 from 值并排除每个范围的 to 值..

      在您的查询中,

      {
        "size": 0,
        "query": {
          "match_all": {}
        },
        "aggs": {
          "daily_team": {
            "date_range": {
              "field": "deleted_date",
               "format": "YYYY-MM-DD",
              "ranges": [
                {
                  "from": "2014-08-02"
                },
                {
                  **"to": "2014-08-02"** -- > if you want to include 2014-08-02 date then do,
                    "to" : "2014-08-03" (increase date by one, so 08-02 is included) 
                }
              ]
            },
            "aggs": {
              "daily_team_count": {
                "terms": {
                  "field": "user_id"
                }
              }
            }
          }
        }
      }
      

      我也遇到过这个问题,我想你的问题也一样。

      仅供参考,请查看link

      【讨论】:

        猜你喜欢
        • 2014-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多