我正在努力从ElasticSearch获取所需的信息。
我的日志语句是这样的:
field1: Example
field2: Example2
field3: Example3
我想搜索一个时间范围(使用过去的24小时),以查找
this
中的field1
和that
中的field2
的所有数据。然后可能有多个
this.that.[field3]
条目,因此我只想返回该字段的最大值。实际上,在我的数据中,field3实际上是条目的键。
检索所需信息的最佳方法是什么?我设法使用aggs返回了结果,但是数据在存储桶中,我只对具有field3最大值的数据感兴趣。
我添加了我要查询的示例:https://jsonblob.com/54535d49e4b0d117eeaf6bb4
{
"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": []
}
}
}
}
}
因此,上面的示例仅显示CarName = Toyota和Attribute = TimeUsed的那些。
我的数据如下:
有x个汽车
CarName
,每辆汽车有y个Attributes
,而每个Attributes
都有带时间戳的文档。首先,我正在寻找CarName.Attribute.timestamp(最新)的查询,但是,如果我仅能使用一个查询来获取EVERY CarName的EVERY属性的最新时间戳,那么这将减少来自〜50比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"
}
}
}
]
}
}
}
}
}
关于elasticsearch - ElasticSearch按field1 THEN过滤field2 THEN占用field3的最大值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26657295/