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

时间:2015-08-06 14:12:40

标签: c# elasticsearch asp.net-web-api web-applications nosql

我有一个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之前没有任何文档,则为零)

1 个答案:

答案 0 :(得分:2)

我在上面的评论中指的是这样的事情:

{
  "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