【问题标题】:ElasticSearch filtering by field1 THEN field2 THEN take max of field3ElasticSearch 按 field1 过滤 THEN field2 THEN take max of field3
【发布时间】:2014-10-31 19:00:27
【问题描述】:

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

我的日志语句是这样的:

field1: Example
field2: Example2
field3: Example3

我想搜索一个时间范围(使用过去 24 小时)来查找在 field1 中具有 this 和在 field2 中具有 that 的所有数据。

然后可能有多个this.that.[field3] 条目,所以我只想返回该字段的最大值。

其实在我的数据中,field3其实就是入口的key。

检索我需要的信息的最佳方式是什么?我已经设法使用 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(最新)的查询,但是,如果我能够只使用一个查询来获取每个 CarName 的每个属性的最新时间戳,那么这将减少从 ~50 到 1 的查询调用。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    如果您使用的是 ElasticSearch v1.3+,您可以添加带有参数 size:1top_hits 聚合并对 field3 值进行降序排序。

    这将根据您的意愿返回具有最大值的整个文档。

    这个example in the documentation 可能会成功。

    编辑:

    好的,看来您不需要整个文档,只需要最大时间戳值。您可以使用 max 聚合而不是使用 top_hits 聚合。

    以下查询(未经测试)应仅在一个请求中为您提供每个 CarName 前 10 个值的每个前 10 个 Attribute 值的最大 timestamp 值。

    terms 聚合就像一个 GROUP BY 子句,您不必查询 50 次来检索每个 CarName/Attribute 组合的值:这是为 Attribute 嵌套一个 terms 聚合的要点CarName 聚合。

    请注意,要正常工作,CarNameAttribute 字段应为 not_analyzed。如果不是这种情况,您的存储桶中会出现“有趣”的结果。这个问题(和可能的解决方案)已经很好地描述了here

    随意更改terms 聚合的size 参数以适合您的情况。

    {
      "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"
                    }
                  }
                }
              ]
            }
          }
        }
      }
    }
    

    【讨论】:

    • 您好汤姆,感谢您的帮助。我已经用我正在使用的查询更新了我的原始帖子,因为我似乎无法让 aggs 工作。你介意快速看看我哪里出错了吗?
    • 非常感谢汤姆,实际上,在您发布答案前几分钟,我就设法让它工作了。我的 aggs 嵌套有问题。你的答案正是我想要的。感谢您抽出宝贵时间:-)
    • 快点,Tom,有没有办法在 ElasticSearch 中(即今天)做相对日期,而不是放入 gte 和 lte?
    • 您可以在日期中使用now(例如now-1h)。查看this 了解有关日期数学的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多