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

我的日志语句是这样的:

field1: Example
field2: Example2
field3: Example3

我想搜索一个时间范围(使用过去的24小时),以查找this中的field1that中的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_hitssize: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"
                }
              }
            }
          ]
        }
      }
    }
  }
}

关于elasticsearch - ElasticSearch按field1 THEN过滤field2 THEN占用field3的最大值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26657295/

10-11 06:17