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

分类值上的elasticsearch排序聚合

张鸿志
2023-03-14

在elasticsearch中,我可以在第二个聚合的数字字段上聚合和排序聚合。

例如。

GET myindex/_search
{
  "size":0,
  "aggs": {
    "a1": {
      "terms": { 
        "field": "FIELD1",
        "size":0,
        "order": {"a2": "desc"}  
      },
      "aggs":{
        "a2":{
          "sum":{
            "field":"FIELD2"
          }
        }
      }
    }
  }
}

但是,我想根据分类字段值对聚合进行排序。也就是说,字段2的值是(“a”、“b”、“c”)中的一个值——我想首先按所有文档对a1进行排序,字段2为:“a”,然后字段2为“b”,最后字段2为“c”。

在我的例子中,每个字段1都有一个唯一的字段2。所以我真的只想找到一种方法,按字段2对a1结果进行排序

共有2个答案

班浩皛
2023-03-14

我找到了一种有效的方法。您必须首先在FIELD2上聚合,然后在FIELD1上聚合。

    {
      "size": 0,
      "aggs": {
        "a2": {
          "terms": {
            "size": 0,
            "field": "FIELD2",
            "order": {
              "_term": "asc"
            }
          },
          "aggs": {
            "a1": {
              "terms": {
                "size": 0,
                "field": "FIELD1",
                "order": {
                  "_term": "asc"
                }
              }
            }
          }
        }
      }
    }
范鸿
2023-03-14

我不确定你到底想要什么,但我尝试遵循。我使用映射创建了索引

PUT your_index
{
  "mappings": {
    "your_type": {
      "properties": {
        "name": {
          "type":   "string"
        },
        "fruit" : {"type" : "string", "index": "not_analyzed"}
      }
    }
  }
}

然后我索引了一些这样的文件

PUT your_index/your_type/1
{
  "name" : "federer",
  "fruit" : "orange"
}

然后我用以下聚合对所有带有水果的玩家进行排序

{
  "size": 0,
  "aggs": {
    "a1": {
      "terms": {
        "field": "name",
        "order": {
          "_term": "asc"
        }
      },
      "aggs": {
        "a2": {
          "terms": {
            "field": "fruit",
            "order": {
              "_term": "asc"
            }
          }
        }
      }
    }
  }
}

我得到的结果是

"aggregations": {
      "a1": {
         "doc_count_error_upper_bound": 0,
         "sum_other_doc_count": 0,
         "buckets": [
            {
               "key": "federer",
               "doc_count": 3,
               "a2": {
                  "doc_count_error_upper_bound": 0,
                  "sum_other_doc_count": 0,
                  "buckets": [
                     {
                        "key": "green apple",
                        "doc_count": 1
                     },
                     {
                        "key": "orange",
                        "doc_count": 2
                     }
                  ]
               }
            },
            {
               "key": "messi",
               "doc_count": 2,
               "a2": {
                  "doc_count_error_upper_bound": 0,
                  "sum_other_doc_count": 0,
                  "buckets": [
                     {
                        "key": "apple",
                        "doc_count": 1
                     },
                     {
                        "key": "banana",
                        "doc_count": 1
                     }
                  ]
               }
            },
            {
               "key": "nadal",
               "doc_count": 2,
               "a2": {
                  "doc_count_error_upper_bound": 0,
                  "sum_other_doc_count": 0,
                  "buckets": [
                     {
                        "key": "blueberry",
                        "doc_count": 1
                     },
                     {
                        "key": "watermelon",
                        "doc_count": 1
                     }
                  ]
               }
            },
            {
               "key": "ronaldo",
               "doc_count": 2,
               "a2": {
                  "doc_count_error_upper_bound": 0,
                  "sum_other_doc_count": 0,
                  "buckets": [
                     {
                        "key": "banana",
                        "doc_count": 1
                     },
                     {
                        "key": "watermelon",
                        "doc_count": 1
                     }
                  ]
               }
            }
         ]
      }
   }

确保未分析字段2,否则会得到意外结果。

这有帮助吗?

 类似资料:
  • 问题内容: 我想将数据汇总到另一个字段中,也想根据名称以排序方式获取汇总数据。 我的数据是: 我的查询: 我的映射是: 我正在根据分组记录的相关性平均值来获取数据。现在,我想要的是第一个基于groupid的记录,然后在每个存储桶中根据名称字段对数据进行排序。 我想对一个字段进行分组,然后在对分区进行分组之后,对另一个字段进行排序。这是样本数据。 还有其他字段,例如created_on,update

  • 我正在尝试使用Elasticsearch(2.4)聚合对使用该查询的多个索引按“productId”分组 1) 我想按分数排序,所以我尝试使用 哪个返回 2) 此外,我正在尝试使用分页,“size”键实际起作用,但“from”键不起作用 **更新-聚合结果示例** 希望有人能帮忙

  • 在elasticsearch中,是否有方法使用自定义分数对聚合桶进行排序/排序? 我正在按客户姓名进行扣球。每个客户都有多个订单,其中有一个交货日期字段(DeliveDate)。我想根据与当前日期的距离(接近程度)对桶进行排序。 例如,对交货日期更接近今天日期的客户名进行排序。 非常感谢。

  • 是否可以在elasticsearch中更改范围聚合结果的排序?我在elasticsearch中有一个键控范围查询,并希望根据键而不是doc_count进行排序。 我的文件是: 和聚合查询: 此查询的结果是: 我想根据关键字对结果进行排序,而不是根据范围值。根据elasticsearch文档,无法指定排序顺序,当指定排序顺序时,我得到以下异常: 你有什么办法吗?谢谢!

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

  • 在这里,我得到了错误: “无效的术语聚合顺序路径[price>price>price.max]。术语桶只能在子聚合器路径上排序,该路径由路径中的零个或多个单桶聚合和路径末尾的最终单桶或度量聚合组成。子路径[price]指向非单桶聚合” 如果我按持续时间聚合排序,查询可以正常工作,如 那么,有什么方法可以通过嵌套字段上的嵌套聚合来排序聚合吗?