我正在努力从ElasticSearch获取我需要的信息。
我的日志声明是这样的:
field1: Example
field2: Example2
field3: Example3
我想搜索一个时间范围(使用过去24小时)来查找this
中field1
和that
field2
中this.that.[field3]
的所有数据。
然后可能有多个{
"size": 0,
"aggs": {
"agg_129": {
"filters": {
"filters": {
"CarName: Toyota": {
"query": {
"query_string": {
"query": "CarName: Toyota"
}
}
}
}
},
"aggs": {
"agg_130": {
"filters": {
"filters": {
"Attribute: TimeUsed": {
"query": {
"query_string": {
"query": "Attribute: TimeUsed"
}
}
}
}
},
"aggs": {
"agg_131": {
"terms": {
"field": "@timestamp",
"size": 0,
"order": {
"_count": "desc"
}
}
}
}
}
}
}
},
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"must": [
{
"range": {
"@timestamp": {
"gte": "2014-10-27T00:00:00.000Z",
"lte": "2014-10-28T23:59:59.999Z"
}
}
}
],
"must_not": []
}
}
}
}
}
条目,所以我只想返回该字段的最大值。
事实上,在我的数据中,field3实际上是条目的关键。
检索我需要的信息的最佳方法是什么?我已经设法使用aggs返回结果,但是数据在桶中,我只对最大值为field3的数据感兴趣。
我添加了一个我想要查询的示例示例:https://jsonblob.com/54535d49e4b0d117eeaf6bb4
CarName
因此,上面的示例仅显示具有CarName = Toyota和Attribute = TimeUsed的那些。
我的数据如下:
有{x}个车辆Attributes
,每辆车的Attributes
数量为{{1}},每个{{1}}都有一个带时间戳的文件。
首先,我正在寻找CarName.Attribute.timestamp(最新)的查询,但是,如果我只能使用一个查询来获取每个CarName的每个属性的最新时间戳,那么这会减少查询从50到1的调用。
答案 0 :(得分:1)
如果您使用的是ElasticSearch v1.3 +,则可以在top_hits
值上添加size:1
聚合参数field3
和降序排序。
这将根据您的意愿在字段上返回整个文档的最大值。
这example in the documentation可能会成功。
编辑:
好的,似乎您不需要整个文档,只需要最大时间戳值。您可以使用max
聚合,而不是使用top_hits
聚合。
以下查询(未经过测试)应该只为一个请求提供每个timestamp
前10个值的前10个Attribute
值的最大CarName
值。
terms
聚合就像一个GROUP BY子句,您不必查询50次来检索每个CarName / Attribute组合的值:这是嵌套terms
聚合的点Attribute
聚合中的CarName
。
请注意,要正常使用,CarName
和Attribute
字段应为not_analyzed
。如果情况并非如此,那么你的桶中就会有“有趣”的结果。问题(和可能的解决方案)已经很好地描述了here。
随意更改size
聚合的terms
参数以适合您的情况。
{
"size": 0,
"aggs": {
"by_carnames": {
"terms": {
"field": "CarName",
"size": 10
},
"aggs": {
"by_attribute": {
"terms": {
"field": "Attribute",
"size": 10
},
"aggs": {
"max_timestamp": {
"max": {
"field": "@timestamp"
}
}
}
}
}
}
},
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"range": {
"@timestamp": {
"gte": "2014-10-27T00:00:00.000Z",
"lte": "2014-10-28T23:59:59.999Z"
}
}
}
]
}
}
}
}
}