我使用的是elasticsearch 6.2。聚合的_key字段是字符串BUT,因为这些数据包含数字,我想将其视为NUMBER。 所以我可以获得[1,3,7,11,13]顺序的结果,而不是[1,11,13,3,7]
"agg_oid": {
"terms": {
"field": "oid",
"size": 10,
"order": {
"_key": "desc" // how should I change here?
}
}
},
答案 0 :(得分:1)
由于您的oid
字段可以包含字母数字数据,因此我建议您创建一个仅包含数字数据的子字段,然后您可以在汇总中使用它。
您当前的映射必须如下所示:
{
"oid": {
"type": "keyword"
}
}
将其更改为
{
"oid": {
"type": "keyword",
"fields": {
"numeric": {
"type": "integer",
"ignore_malformed": true
}
}
}
}
然后你就可以在数字子字段上聚合并获得你期望的结果,如下所示:
POST test/_search
{
"size": 0,
"aggs": {
"agg_oid": {
"terms": {
"field": "oid.numeric",
"size": 10,
"order": {
"_key": "desc"
}
}
}
}
}
<强>更新强>:
如果您不想或不能更改映射,您可以执行以下操作。
首先在oid
字段上启用fielddata(请注意,这会对性能和堆产生很大影响)
PUT your_index/_mapping/your_type
{
"properties": {
"oid": {
"type":"text",
"fielddata": true
}
}
}
然后您可以运行以下查询,它会按预期对您的键进行排序:
POST your_index/_search
{
"size": 0,
"aggs": {
"agg_oid": {
"terms": {
"field":"oid",
"size": 10,
"order": {
"oidNum": "desc"
}
},
"aggs": {
"oidNum": {
"avg": {
"script": "try {return Integer.parseInt(params._source.oid)} catch(NumberFormatException nfe){return 0;}"
}
}
}
}
}
}