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的主要内容,如果未能解决你的问题,请参考以下文章