我有一个ElasticSearch数据库,里面有一些文件。每个文档都有自己的时间戳字段。
我目前有一个WebApi,需要两个时间戳startTime
和endTime
。 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;
非常简单,它基本上是基于startTime
和endTime
参数的范围查询。它有效。 : - )
现在的问题是:我需要检索时间戳低于startTime
的最新文档。
所以基本上最终的查询应该是:
startTime
,endTime
] 和
startTime
第一部分显然可以返回任意数量的记录,零,只有一个或多个
第二部分应该只返回一个文档,(如果starTime
之前没有任何文档,则为零)
答案 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
]
}
]
}
}
}
}
}
startTime
和endTime
之间的列表位于hits
之下。低于startTime
的最低值低于aggregations
。