ElasticSearch:检索给定时间戳的最新文档

本文关键字:最新 文档 时间戳 定时间 检索 ElasticSearch | 更新日期: 2023-09-27 18:06:53

我有一个ElasticSearch数据库,里面有一些文档。每个文档都有自己的时间戳字段。

我目前有一个WebApi,它需要两个时间戳,startTimeendTime。WebApi只是在ES上执行一个查询,以获取具有给定范围内的时间戳的文档。

这是我当前的查询:

    var readRecords = ElasticClient.Search<SegmentRecord>(s => s
        .Index(ElasticIndexName)
        .Filter(f =>
            f.Range(i =>
                i.OnField(a => a.DateTime).GreaterOrEquals(startTime).LowerOrEquals(endTime))).Size(MaximumNumberOfReturnedDocs).SortAscending(p => p.DateTime)).Documents;

非常简单,它基本上是一个基于startTimeendTime参数的范围查询。它是有效的。:-(

现在的问题是:我甚至需要检索时间戳低于startTime的最新文档。所以基本上最后的查询应该是:

  • 范围[startTimeendTime]中的所有文档

  • 具有时间戳<startTime

第一部分显然可以返回任意数量的记录,零,只有一个或多个

第二部分应该只返回一个文档(如果在starTime之前不存在任何文档,则返回零(

ElasticSearch:检索给定时间戳的最新文档

我在上面的评论中是这样说的:

{
  "query": {
    "filtered": {
      "filter": {
        "range": {
          "time": {
            "gte": "2015-06-04",
            "lte": "2015-06-05"
          }
        }
      }
    }
  },
  "aggs": {
    "global_all_docs_agg": {
      "global": {},
      "aggs": {
        "filter_for_min": {
          "filter": {
            "range": {
              "time": {
                "lte": "2015-06-04"
              }
            }
          },
          "aggs": {
            "min_date": {
              "top_hits": {
                "size": 1,
                "sort": [
                  {
                    "time": "asc"
                  }
                ]
              }
            }
          }
        }
      }
    }
  }
}

结果如下:

      "hits": [
         {
            "_index": "sss",
            "_type": "test",
            "_id": "1",
            "_score": 1,
            "_source": {
               "time": "2015-06-05"
            }
         },
         {
            "_index": "sss",
            "_type": "test",
            "_id": "2",
            "_score": 1,
            "_source": {
               "time": "2015-06-04"
            }
         },
         {
            "_index": "sss",
            "_type": "test",
            "_id": "4",
            "_score": 1,
            "_source": {
               "time": "2015-06-05"
            }
         }
      ]
   },
   "aggregations": {
      "global_all_docs_agg": {
         "doc_count": 6,
         "filter_for_min": {
            "doc_count": 4,
            "min_date": {
               "hits": {
                  "total": 4,
                  "max_score": null,
                  "hits": [
                     {
                        "_index": "sss",
                        "_type": "test",
                        "_id": "5",
                        "_score": null,
                        "_source": {
                           "time": "2015-06-01"
                        },
                        "sort": [
                           1433116800000
                        ]
                     }
                  ]
               }
            }
         }
      }
   }

startTimeendTime之间的列表位于hits之下。低于startTime的最小值在aggregations之下。