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

Elasticsearch排序术语聚合热门子聚合中字段后的存储桶

朱啸
2023-03-14

我想根据top hits聚合中第一个元素所拥有的属性,从terms聚合中订购Bucket。

我的尽力而为查询如下(有语法错误):

{
    "aggregations": {
        "toBeOrdered": {
            "terms": {
                "field": "parent_uuid",
                "size": 1000000,
                "order": {
                    "topAnswer._source.id": "asc"
                }
            },
            "aggregations": {
                "topAnswer": {
                    "top_hits": {
                        "size": 1
                    }
                }
            }
        }
    }
}

有人知道如何做到这一点吗?

例子:

{
  "a":1,
  "b":2,
  "id":4
}
{
  "a":1,
  "b":3,
  "id":1
}
{
  "a":2,
  "b":4,
  "id":3
}

按“a”分组,按“id”(desc)排序存储桶,并按“b”(desc)排序最热门的内容,将给出:

{2:{
  "a":2,
  "b":4,
  "id":3
},1:{
  "a":1,
  "b":3,
  "id":1
}}

共有1个答案

丁兴德
2023-03-14

您可以使用以下查询来完成。这个想法是为每个parent_uuid存储桶显示具有最小id值的第一个顶部命中,并根据最小的id值对parent_uuid存储桶进行排序以及使用min子聚合。

{
  "aggregations": {
    "toBeOrdered": {
      "terms": {
        "field": "parent_uuid",
        "size": 1000000,
        "order": {
          "topSort": "desc"
        }
      },
      "aggregations": {
        "topAnswer": {
          "top_hits": {
            "size": 1,
            "sort": {
              "b": "desc"
            }
          }
        },
        "topSort": {
          "max": {
            "field": "id"
          }
        }
      }
    }
  }
}

试试看,如果这对你有用,就报告。

 类似资料:
  • 我们目前正在开发一个多语言文档CMS。因此,我们有翻译成不同语言的文件。 对于使用Elasticsearch进行搜索,我们目前使用每种语言(德语、英语、法语……)一个索引,其中同一文档的所有翻译共享相同的ID。 当用户搜索特定术语时,我们希望在所有语言中搜索,但只返回不同ID的列表。据我所知,只有使用以下术语聚合才能做到这一点: 这很好,但是作为弹性搜索文档https://www.elastic.

  • 问题内容: 我正在尝试使用以下查询对以下数据进行elasticsearch来执行术语聚合,输出将名称分解为标记(请参见下面的输出)。因此,我尝试将os_name映射为multi_field,但现在无法通过它查询。是否可以有没有令牌的索引?例如“ Fedora Core”? 查询: 数据: 输出: 映射: 问题答案: 实际上,您应该像这样更改映射 并且您的aggs应该更改为:

  • 以下是数据集的快照: 我想获得员工名单以及employeeStatus和employeeAddr。 所以我在employeeId上使用术语聚合,然后使用employeeStatus和employeeAddr的子聚合来获得这些详细信息。下面的查询正确返回结果。 现在我只想要永久身份的员工。所以我正在应用过滤器聚合。 现在的问题是雇员地址聚合没有为雇员地址返回存储桶,因为记录2在聚合完成之前就被过滤掉

  • 问题内容: 我想按top_hit的doc.score订购存储桶。我当前的实现如下。 这是错误的,因为存储桶是按其最高得分而不是其source_priority文档最高得分排序的。有办法解决这个问题吗? 问题答案: 我遇到了同样的问题,而解决问题的方法是在docs得分上引入子汇总。然后在我的外部聚合中,我按max_score聚合的名称排序。 我遵循了此链接上的指示: http://www.elast

  • 问题内容: 如何编写一个将整个字段值而不是单个标记考虑在内的ElasticSearch术语聚合查询?比如,我想通过城市名聚集,但下面的回报,,并作为单独的水桶,不和的水桶预期。 问题答案: 您应该在映射中解决此问题。添加一个not_analyzed字段。如果您还需要分析的版本,则可以创建多字段。 现在在city.raw上创建聚合

  • 问题内容: 我有这种结构的文档: 我想对FIELD2.SUBFIELDs中的数字总和的结果进行排序: 如果这样做,我将获得未排序的存储桶,但是我希望存储桶按“ a2”值进行排序。我该怎么做?谢谢! 问题答案: 你差点就吃了。你只需要一个添加属性到你的条件聚合,是这样的: