当前位置: 首页 > 面试题库 >

如何过滤top_hits指标聚合结果[Elasticsearch]

澹台星剑
2023-03-14
问题内容

我想按地址分组,然后按日期获取最新地址,然后按状态过滤此结果。

ex
  {address: 'A', date: '10-10-1991', status: 'sold'}
  {address: 'A', date: '10-10-2016', status: 'active'}
  {address: 'A', date: '10-10-1981', status: 'sold'}

  {address: 'B', date: '10-10-2016', status: 'sold'}
  {address: 'B', date: '10-10-1771', status: 'sold'}
  {address: 'B', date: '10-10-1991', status: 'active'}

//Getting address with sold status should give me only this record {address: 'B', date: '10-10-2016', status: 'sold'} since most updated one in address A is an active status

我在elasticsearch中有此查询,但它最多只能按地址分组并获取最新日期。我无法按状态过滤此结果。

 {
    "size": 0,
    "aggs": {
        "group": {
            "terms": {
                "field": "address"
            },
            "aggs": {
                "group_docs": {
                    "top_hits": {
                        "size": 1,
                        "sort": [
                            {
                                "updated_date": {
                                    "order": "desc"
                                }
                            }]
                    }

                }
            }
        }
    }
}

// This query gives me this records
{address: 'A', date: '10-10-2016', status: 'active'}
{address: 'B', date: '10-10-2016', status: 'sold'}

我想使用Elasticsearch从该结果中获得出售状态


问题答案:

使用ES 2.x使用ES可以做到这一点pipeline aggregations。首先,我们需要汇总地址。然后,我们使用两种汇总,一种汇总获取最新日期,另一种汇总获取销售状态的最新日期。然后,我们检查两个日期是否都与存储桶选择器聚合匹配。这就是它的样子。

{
  "size": 0,
  "aggs": {
    "unique_address": {
      "terms": {
        "field": "address",
        "size": 10
      },
      "aggs": {
        "latest_date": {
          "max": {
            "field": "date"
          }
        },
        "filter_sold": {
          "filter": {
            "term": {
              "status": "sold"
            }
          },
          "aggs": {
            "latest_sold_date": {
              "max": {
                "field": "date"
              }
            }
          }
        },
        "should_we_consider": {
          "bucket_selector": {
            "buckets_path": {
              "my_var1": "latest_date",
              "my_var2": "filter_sold>latest_sold_date"
            },
            "script": "my_var1 == my_var2"
          }
        }
      }
    }
  }
}

希望这可以帮助!!



 类似资料:
  • 问题内容: 我要实现的目标:我不希望查询过滤器过滤“年龄”聚合,并且希望能够对其应用过滤器。 因此,如果我从以下查询开始: 我的聚合“ young_age”将同时被filter_1和filter_2过滤。我不希望我的汇总被filter_1过滤。 在查看文档时,我认为全局聚合可以解决我的问题,因此我编写了以下查询: 但是然后elasticsearch抱怨我的filter_2: “”“在[global

  • 问题内容: 简短的问题:如果我有每个存储区的top_hits的汇总,如何在结果结构中求和特定值? 细节: 我有许多记录,每个商店包含一定数量。我想获取每个商店的所有最新记录的总和。 为了获得每个商店的最新记录,我创建以下聚合: 假设我有两个商店,每个商店有两个数量用于两个不同的时间戳。这是该聚合的结果: 我现在想在ElasticSearch中进行汇总,以汇总这些存储桶中的总和。在示例数据中,总和超

  • 问题内容: 我正在尝试过滤存储桶中的嵌套聚合。 对应: 索引数据: 我正在使用此查询和聚合定义 我从聚合结果中得到的是: 我在筛选存储桶列表时遇到了麻烦,因为它们只能提供所提供的事件ID,因此结果应类似于: 问题答案: 您快到了,只需要在聚合中添加过滤器即可,如下所示: 原因是您的查询将正确选择具有指定事件ID的嵌套事件的所有文档,但是,汇总将对所有选定文档中的所有嵌套事件进行处理。因此,您还需要

  • 我使用这篇Baeldung文章为Spring 2.0.4应用程序添加了执行器支持。在第4.4节中,它谈到 你们中有谁知道关于创建这种聚合的教程、示例或其他文档吗? 更多信息我在我的应用程序中有一个服务,它依赖于几个子组件。只有当所有这些子组件都关闭时,服务本身才被认为关闭。只要有一个站起来,那么服务就站起来了。目前使用的是正常的机制,如果其中一个子组件宕机,则将服务器标记为宕机。 似乎我想使用,但

  • 问题内容: 想象一下,我有两种记录:一个存储桶和一个项目,其中存储在存储桶中的项目,而存储桶中的项目可能相对较少(通常不超过4个,从不超过10个)。这些记录被压缩为一个(具有更多存储桶信息的项目),并放置在Elasticsearch中。我要解决的任务是通过依赖项属性的过滤查询一次找到500个存储桶(最大),其中包含所有相关项,而我受困于限制/抵消聚合。我该如何执行此类任务?我看到聚合使我可以控制相

  • 我已经在按\u score desc排序的查询部分中获得了所需的查询结果。现在我需要提取每个文档的3个字段。我想实现如下目标: 我刚刚试过: 1)使用折叠删除重复的值 但问题是它只会保留filed1的不同值,而忽略field 2和field 3的值。例如,我们有2条记录,如下所示: 使用此方法,我们只能获得一条记录,因为它们具有相同的field1值。我想要这三个字段的不同组合值。我们可以使用int