ElasticSearch按field1过滤THEN field2那么取最大的field3

时间:2014-10-30 15:38:14

标签: elasticsearch

我正在努力从ElasticSearch获取我需要的信息。

我的日志声明是这样的:

field1: Example
field2: Example2
field3: Example3

我想搜索一个时间范围(使用过去24小时)来查找thisfield1that field2this.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的调用。

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

请注意,要正常使用,CarNameAttribute字段应为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"
                }
              }
            }
          ]
        }
      }
    }
  }
}