如何解决agg名称的排序未保留在响应中
我正在执行弹性查询,并使用REST调用读取Java代码内部的响应。 当我读取响应时,未按响应顺序返回字段200、204、4xx,5xx的顺序。
在放置的示例请求下方找到
GET appl-activity*/_search
{
"size": 0,"aggs": {
"group_by_daterange": {
"range": {
"field": "Date","ranges": [
{
"from": "Fri Oct 23 02:54:26 2020 -0400","to": "Mon Oct 26 05:54:26 2020 -0400"
}
]
},"aggs": {
"byapplication": {
"terms": {
"field": "application.keyword","size": 1000
},"aggs": {
"by200": {
"sum": {
"field": "200"
}
},"by204": {
"sum": {
"field": "204"
}
},"by4xx": {
"sum": {
"field": "4xx"
}
},"by5xx": {
"sum": {
"field": "5xx"
}
}
}
}
}
}
}
}
响应返回:-
{
"took" : 35,"timed_out" : false,"_shards" : {
"total" : 2,"successful" : 2,"skipped" : 0,"failed" : 0
},"hits" : {
"total" : 1173,"max_score" : 0.0,"hits" : [ ]
},"aggregations" : {
"group_by_daterange" : {
"buckets" : [
{
"key" : "Fri Oct 23 06:54:26 2020 +0000-Mon Oct 26 09:54:26 2020 +0000","from" : 1.603436066E12,"from_as_string" : "Fri Oct 23 06:54:26 2020 +0000","to" : 1.603706066E12,"to_as_string" : "Mon Oct 26 09:54:26 2020 +0000","doc_count" : 30,"byapplication" : {
"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [
{
"key" : "SITE","doc_count" : 20,"by4xx" : {
"value" : 1.0
},"by5xx" : {
"value" : 0.0
},"by204" : {
"value" : 0.0
},"by200" : {
"value" : 5342.0
}
},{
"key" : "MOBILE","doc_count" : 10,"by4xx" : {
"value" : 0.0
},"by200" : {
"value" : 5635.0
}
}
]
}
}
]
}
}
}
我期望响应代码的顺序与请求中的顺序相同。请帮助我吗?
{
"key": "MOBILE","doc_count": 10,"by200": {
"value": 5635
},"by204": {
"value": 0
},"by4xx": {
"value": 0
},"by5xx": {
"value": 0
}
}
解决方法
与数组不同,JSON字典不保证任何顺序。这意味着没有规范会强制ElasticSearch或任何其他JSON-in / JSON-out接口保留输入顺序。
不幸的是,某些系统(例如stripe)会花更多的精力在返回客户端之前按字母顺序对响应键进行排序。
话虽如此,我曾经通过根据想要的顺序在agg关键字名称前添加字母数字字符组合来解决此问题:
{
"1__myAggName": { ... },"2__myAggName": { ... },...
}
然后在客户端上,我将对agg键进行简单排序并删除前缀。
但是这些天我倾向于在下订单和其他信息时使用aggregation metadata。这极大地提高了我所有后处理步骤的透明度和可读性:
{
...
"byapplication": {
"terms": {
"field": "application.keyword","size": 1000
},"aggs": {
"by200": {
"meta": { <--
"index": 0
},"sum": {
"field": "200"
}
},"by204": {
"meta": { <--
"index": 1
},"sum": {
"field": "204"
}
},"by4xx": {
"meta": {
"index": 2
},"sum": {
"field": "4xx"
}
},"by5xx": {
"meta": {
"index": 3
},"sum": {
"field": "5xx"
}
}
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。