当前位置: 首页 > 知识库问答 >
问题:

ElasticSearch多词聚合顺序

阎璞瑜
2023-03-14

我有一个描述容器的文档结构,它的一些字段是:

containerId -> Unique Id,String
containerManufacturer -> String
containerValue -> Double
estContainerWeight ->Double
actualContainerWeight -> Double

我想运行一个搜索聚合,该聚合在两个权重字段上有两个级别的术语聚合,但按权重字段的降序排列,如下所示:

{
  "size": 0,
  "aggs": {
    "by_manufacturer": {
      "terms": {
        "field": "containerManufacturer",
        "size": 10,
        "order": {"estContainerWeight": "desc"} //Cannot do this
      },
      "aggs": {
        "by_est_weight": {
          "terms": {
            "field": "estContainerWeight",
            "size": 10,
            "order": { "actualContainerWeight": "desc"} //Cannot do this
          },
          "aggs": {
            "by_actual_weight": {
              "terms": {
                "field": "actualContainerWeight",
                "size": 10
              },
              "aggs" : {
                "container_value_sum" : {"sum" : {"field" : "containerValue"}}
              }
            }
          }
        }
      }
    }
  }
}

样本文件:

{"containerId":1,"containerManufacturer":"A","containerValue":12,"estContainerWeight":5.0,"actualContainerWeight":5.1}
{"containerId":2,"containerManufacturer":"A","containerValue":24,"estContainerWeight":5.0,"actualContainerWeight":5.2}
{"containerId":3,"containerManufacturer":"A","containerValue":23,"estContainerWeight":5.0,"actualContainerWeight":5.2}
{"containerId":4,"containerManufacturer":"A","containerValue":32,"estContainerWeight":6.0,"actualContainerWeight":6.2}
{"containerId":5,"containerManufacturer":"A","containerValue":26,"estContainerWeight":6.0,"actualContainerWeight":6.3}
{"containerId":6,"containerManufacturer":"A","containerValue":23,"estContainerWeight":6.0,"actualContainerWeight":6.2}

预期输出(未完成):

{
  "by_manufacturer": {
    "buckets": [
      {
        "key": "A",
        "by_est_weight": {
          "buckets": [
            {
              "key" : 5.0,
              "by_actual_weight" : {
                "buckets" : [
                  {
                    "key" : 5.2,
                    "container_value_sum" : {
                      "value" : 1234 //Not actual sum
                    }
                  },
                  {
                    "key" : 5.1,
                    "container_value_sum" : {
                      "value" : 1234 //Not actual sum
                    }
                  }
                ]
              }
            },
            {
              "key" : 6.0,
              "by_actual_weight" : {
                "buckets" : [
                  {
                    "key" : 6.2,
                    "container_value_sum" : {
                      "value" : 1234 //Not actual sum
                    }
                  },
                  {
                    "key" : 6.3,
                    "container_value_sum" : {
                      "value" : 1234 //Not actual sum
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    ]
  }
}

但是,我不能按嵌套聚合排序。(错误:术语桶只能在子聚合器路径上排序,该子聚合器路径由路径中的零个或多个单桶聚合和最终的单桶或指标聚合构建...)

例如,对于上述示例输出,如果我在术语聚合上引入大小(如果我的数据很大,我将不得不这样做),我无法控制生成的存储桶,因此我只想获得每个术语聚合的前N个权重。

有没有办法做到这一点?

共有1个答案

严兴旺
2023-03-14

如果我对您的问题理解正确,您希望按照制造商的集装箱估计重量的降序排列制造商术语,然后按照实际重量的降序排列每桶“估计重量”。

{
  "size": 0,
  "aggs": {
    "by_manufacturer": {
      "terms": {
        "field": "containerManufacturer",
        "size": 10
      },
        "by_est_weight": {
          "terms": {
            "field": "estContainerWeight",
            "size": 10,
            "order": {
              "_term": "desc"       <--- change to this
            }
          },
            "by_actual_weight": {
              "terms": {
                "field": "actualContainerWeight",
                "size": 10,
                "order" : {"_term" : "desc"}   <----- Change to this
              },
              "aggs": {
                "container_value_sum": {
                  "sum": {
                    "field": "containerValue"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
 类似资料:
  • 在elasticsearch中,是否有方法使用自定义分数对聚合桶进行排序/排序? 我正在按客户姓名进行扣球。每个客户都有多个订单,其中有一个交货日期字段(DeliveDate)。我想根据与当前日期的距离(接近程度)对桶进行排序。 例如,对交货日期更接近今天日期的客户名进行排序。 非常感谢。

  • 假设我在ES中有以下文档,每个文档都有3个字段:f1、f2和分数。我想找到所有文档,按f1、f2分组,按组最大分数排序,在SQL我可以简单地这样做: elasticsearch中的等价物是什么?嵌套术语聚合不会给出正确的顺序,因为返回的f2术语桶都嵌套在同一个f1术语桶中。

  • 我有3个级别的父/子结构。假设: 公司- 由于这里经常更新可用性(以及员工),所以我选择对嵌套使用父/子结构。搜索功能工作正常(所有文档都在正确的碎片中)。 现在我想对这些结果进行排序。按公司(第1级)的元数据对它们进行排序很容易。但我也需要按第3级(可用性)进行排序。 我想要按以下顺序排列的公司列表: 与给定ASC位置的距离 评级DESC 最快可用性ASC 例如: A公司距离我们5英里,评分为4

  • 框架集合由搜索查询选择的所有数据。框架中包含许多构建块,有助于构建复杂的数据描述或摘要。聚合的基本结构如下所示 - 有以下不同类型的聚合,每个都有自己的目的 - 指标聚合 这些聚合有助于从聚合文档的字段值计算矩阵,并且某些值可以从脚本生成。 数字矩阵或者是平均聚合的单值,或者是像一样的多值。 平均聚合 此聚合用于获取聚合文档中存在的任何数字字段的平均值。 例如, 请求正文 响应 如果该值不存在于一

  • 我在elasticsearch中有一个文档索引,每个文档有480个字段。我试图做的是搜索一个词(例如“Apple”),并获得所有其值与搜索词匹配的唯一字段名。所以如果我的文档是: 作为查询的结果,我希望得到如下所示的聚合: 由于每个文档都有480个字段,所以我更喜欢执行multi_match查询,而不是使用包含所有字段的筛选器: 这个查询在ElasticSearch中可能吗?

  • 问题内容: 我似乎无法以某种方式收到包含我的聚合的响应… 使用curl可以按预期工作: 我得到答复: 但是在rails中使用代码: 并在浏览器中呈现 我得到一个空的答复: 如何在这里打印出卷曲的聚集体? 问题答案: 我也在为此而苦苦挣扎,但是现在我发现了如何获得聚合结果。 如果您将 elasticsearch-rails 与 elasticsearch-model gem一起使用,则在 模型上 运