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

tophits JAVA API的Elasticsearch子聚合不起作用

谭卜鹰
2023-03-14

我想在JAVA API中编写elasticsearch聚合代码,以查找字段折叠和结果分组。

json聚合代码如下所示,我从elasticsearch文档中获得了这些代码

“dedup\u by\u score”聚合具有称为“top\u hit”聚合的子聚合,并将此聚合用于桶排序。

... some query
  "aggs": {
    "dedup_by_score": {
      "terms": {
        "field": "keyword",
        "order": {
          "top_hit": "desc"
        },
        "size": 10
      },
      "aggs": {
        "top_hit": {
          "max": {
            "script": {
              "source": "_score"
            }
          }
        }
      }
    }
  }

我想将这个json查询转换为JAVA

这是我已经在JAVA中尝试过的

AggregationBuilder aggregation = AggregationBuilders.terms("dedup_by_score")
    .field("keyword")
    .order(BucketOrder.aggregation("top_hit", false))
    .size(10)
    .subAggregation(
        AggregationBuilders.topHits("top_hit")
        .subAggregation(
            AggregationBuilders.max("max").script(new Script("_score"))
        )
    );

但是我从Elasticsearch得到了如下错误

{
"type":"aggregation_initialization_exception",
"reason":"Aggregator [top_hit] of type [top_hits] cannot accept sub-aggregations"
}

如何修复此Java代码?我现在使用Elasticsearch 6.7.1版本。

提前谢谢

共有1个答案

戎泰
2023-03-14

热门AGG不能有子AGG。尝试以下操作:

AggregationBuilder aggregation = AggregationBuilders.terms("dedup_by_score")
        .field("keyword")
        .order(BucketOrder.aggregation("top_hit", false))
        .size(10)
        .subAggregation(
            AggregationBuilders.max("max").script(new Script("_score"))
                .subAggregation(
                    AggregationBuilders.topHits("top_hit")
                )
        );
 类似资料:
  • 我有3个级别的父/子结构。假设: 公司- 由于这里经常更新可用性(以及员工),所以我选择对嵌套使用父/子结构。搜索功能工作正常(所有文档都在正确的碎片中)。 现在我想对这些结果进行排序。按公司(第1级)的元数据对它们进行排序很容易。但我也需要按第3级(可用性)进行排序。 我想要按以下顺序排列的公司列表: 与给定ASC位置的距离 评级DESC 最快可用性ASC 例如: A公司距离我们5英里,评分为4

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

  • Elasticsearch版本:2.3.3 基本上,标题说明了一切。如果二个嵌套聚合下使用reverse_nested,尽管文档似乎通过限定范围(请参阅结果中的最后一个字段),但其后面的聚合不会以某种方式工作。 这里我准备了一个例子——一个文档是一个学生的注册日期和考试历史。 映射: 试验文件: 聚合查询(无实际意义): 结果是: ...您可以在其中看到聚合“newest_exam_date”不起

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

  • 我知道Elasticsearch支持带bucketing的子聚合(其中bucketing聚合可以有bucketing或metric子聚合)。使用度量聚合无法进行子聚合。也许这是有道理的,但这里是用例。 作为家长,我有术语聚合。并将另一个术语聚合作为它的子项。子术语具有类型为top\u hits的子聚合

  • 我想在我的java应用程序中获得聚合。 首先,我用curl构造了REST查询。它看起来像: 结果和我预期的一样 之后我在java中创建了一些代码 问题是: 如何获取当前bucket项的“contract\u sum”聚合值? 当我在IntelliJ Idea中使用调试工具时,它似乎可以 请帮助我的代码示例。