【问题标题】:Elasticsearch api - order aggregation by @timestampElasticsearch api - @timestamp 的订单聚合
【发布时间】:2020-08-10 02:01:37
【问题描述】:

在我的索引中,我有很多不同结构的文档。所有文档之间的共享密钥如下:(Store,owner,products,timestamp)

{"Store":"books for school","owner":"user_15","products":40,"@timestamp":2020/08/02T18:00, "a1":1,"a2":...}
{"Store":"books for school","owner":"user_15","products":45,"@timestamp":2020/08/02T19:00,"b1":1...}
{"Store":"books for school","owner":"user_17","products":55,"@timestamp":2020/08/02T20:00, "b2":1....}

在我的应用程序中,我试图获取每个商店(所有者、产品)的最新共享密钥。所以对于这个示例,我想获取示例中的最后一个文档。

我尝试对所有共享键创建一个聚合查询,但我不确定如何按日期对内部结果进行排序(以便最新的值排在第一位):

{
  "size": 0,
  "aggs": {
    "store_aggr": {
      "terms": {
        "field": "Store"
      },
      "aggs": {
        "owner_aggr": {
          "terms": {
            "field": "owner"
          }
          }
          ,
            "products_aggr": {
              "terms": {
                "field": "products"
              }
            }
                
        }
      }
    }
  
}

如何按@timestamp 对查询的内部存储桶进行排序?这样我就可以取第一个值,它肯定是最新的..

此外,如何过滤数据以使文档来自最近两天?我需要在@timestamp 字段上添加查询过滤器吗?

【问题讨论】:

  • 提醒一下,技术写作在这里是一种期望。 “U”不是“你”的英文简写,除了可能用于在 WhatsApp 上与您的朋友聊天。请使用真实的单词(和拼写检查器)。

标签: java elasticsearch


【解决方案1】:

是的,您需要range 查询才能仅选择过去两天。至于排序——您可以使用有序的top_hits agg 来检索底层文档:

{
  "query": {
    "range": {
      "@timestamp": {
        "gte": "now-2d"
      }
    }
  }, 
  "size": 0,
  "aggs": {
    "store_aggr": {
      "terms": {
        "field": "Store"
      },
      "aggs": {
        "owner_aggr": {
          "terms": {
            "field": "owner"
          },
          "aggs": {
            "top_hits_aggr": {
              "top_hits": {
                "sort": {
                  "@timestamp": {
                    "order": "desc"
                  }
                }
              }
            }
          }
        },
        "products_aggr": {
          "terms": {
            "field": "products"
          },
          "aggs": {
            "top_hits_aggr": {
              "top_hits": {
                "sort": {
                  "@timestamp": {
                    "order": "desc"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

【讨论】:

  • 第二次你拯救了一天。老实说,我已经自己编写了大部分查询(经过几个小时的尝试):)。但是,您再次在这里提供了帮助,我接受了我不知道如何使用的范围查询 :) 非常感谢您!!!!!!
猜你喜欢
  • 1970-01-01
  • 2017-10-10
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
  • 2015-11-17
  • 1970-01-01
  • 2014-11-18
相关资源
最近更新 更多