Elasticsearch 聚合后排序 --- 2022-04-03

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch 聚合后排序 --- 2022-04-03相关的知识,希望对你有一定的参考价值。

参考技术A 类似terms、histogram、date_histogram这类桶聚合都会动态生成多个桶,如果生成的桶特别多,我们如何确定这些桶的排序顺序,如何限制返回桶的数量。

默认情况,ES会根据doc_count文档总数,降序排序。

ES桶聚合支持两种方式排序:

内置排序参数:

例子:

通常情况下,我们根据桶聚合分桶后,都会对桶内进行多个维度的指标聚合,所以我们也可以根据桶内指标聚合的结果进行排序。

例子:

如果分桶的数量太多,可以通过给桶聚合增加一个size参数限制返回桶的数量。

例子:

ElasticSearch 聚合 - 排序值

【中文标题】ElasticSearch 聚合 - 排序值【英文标题】:ElasticSearch aggregations - sorting values 【发布时间】:2016-04-12 19:39:41 【问题描述】:

在这个示例中,我有一些带有未知数量刻面的汽车。

在进行聚合时,我希望聚合中的值按字母顺序排序。但是,有些方面是整数,这会产生这些聚合

Color
 blue (2)
 red (1)

Top speed
 100 (1)
 120 (1)
 90 (1)

Year
 2015 (1)

如您所见,最高速度方面的排序错误 - 90 应该排在第一位。

样本数据

PUT /my_index

  "mappings": 
    "product": 
      "properties": 
        "displayname" :"type": "string", 
        "facets": 
          "type": "nested", 
          "properties": 
            "name":      "type": "string"  ,
            "value":     "type": "string"  ,
            "datatype":  "type": "string"  
          
        
      
    
  




PUT /my_index/product/1

  "displayname": "HONDA",
  "facets": [
    
      "name": "topspeed",
      "value": "100",
      "datatype": "integer"
    ,
    
      "name": "color",
      "value": "Blue",
      "datatype": "string"
    
  ]


PUT /my_index/product/2

  "displayname": "WV",
  "facets": [
    
      "name": "topspeed",
      "value": "90",
      "datatype": "integer"
    ,
    
      "name": "color",
      "value": "Red",
      "datatype": "string"
    
  ]


PUT /my_index/product/3

  "displayname": "FORD",
  "facets": [
    
      "name": "topspeed",
      "value": "120",
      "datatype": "integer"
    ,
    
      "name": "color",
      "value": "Blue",
      "datatype": "string"
    ,
    
      "name": "year",
      "value": "2015",
      "datatype": "integer"
    
  ]


GET my_index/product/1

GET /my_index/product/_search

  "size": 0, 
   "aggs": 
    "facets": 
      "nested": 
        "path": "facets"
      ,
      "aggs": 
        "nested_facets": 
          "terms": 
            "field": "facets.name"
          ,
          "aggs": 
            "facet_value": 
              "terms": 
                "field": "facets.value",
                "size": 0,
                "order": 
                  "_term": "asc"
                
              
            
          
        
      
    
  

如您所见,每个方面都有一个数据类型(整数或字符串)。

任何想法如何让值排序如下:

Color
 blue (2)
 red (1)

Top speed
 90(1)     
 100 (1)
 120 (1)

Year
 2015 (1)

我已经尝试在构面“sortable_value”中添加一个新字段,我在索引时填充像“00000000090”这样的整数值。但无法使聚合工作。

感谢任何帮助

【问题讨论】:

【参考方案1】:

这是一种不常见的数据表示方式。

我建议将您的数据结构更改为以下 "displayname": "FORD", "facets": "topspeed": 120, "color": "Blue", "year": 2015

【讨论】:

感谢您的建议。产品目录非常多样化,不同方面(颜色、年份、最高速度)的数量> 1000。主要问题是我们不知道我们可以遇到的方面 那么我建议你在映射中尽可能多地指定类型,其余的留给elasticsearch。只要您的构面具有不同的名称,我想他们会这样做,elasticsearch 将根据第一个字段值将自动类型分配给以前未出现过的任何新字段。这种自动分配的类型通常是有意义的。 感谢您回复我。我可以轻松地添加具有单独映射的所有方面,包括正确的数据类型。但是我如何才能进行针对我所有方面的聚合呢?

以上是关于Elasticsearch 聚合后排序 --- 2022-04-03的主要内容,如果未能解决你的问题,请参考以下文章

ElasticSearch 聚合 - 排序值

Elasticsearch聚合学习之四:结果排序

ES 24 - 如何通过Elasticsearch进行聚合检索 (分组统计)

elasticsearch 聚合对存储桶键进行排序

Elasticsearch聚合的嵌套桶如何排序

在 ElasticSearch 6 中按子聚合过滤、排序和分页