ElasticSearch 聚合 - 排序值

Posted

技术标签:

【中文标题】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 聚合 - 排序值的主要内容,如果未能解决你的问题,请参考以下文章

探索Elasticsearch集群API

Elasticsearch:Elasticsearch 中的父级和兄弟级聚合

Elasticsearch:Elasticsearch 中的父级和兄弟级聚合

ElasticSearch聚合aggs入门

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

ElasticSearch实战-DocValue列式存储算法(数据排序/聚合统计)