gpt4 book ai didi

elasticsearch - 响应中未保留的 agg 名称的排序

转载 作者:行者123 更新时间:2023-12-02 23:42:13 28 4
gpt4 key购买 nike

我正在执行弹性查询并使用 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
},
"by5xx" : {
"value" : 0.0
},
"by204" : {
"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 接口(interface)保留输入顺序。
虽然这很不幸,但一些系统(例如 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"
}
}
}
}
}

关于elasticsearch - 响应中未保留的 agg 名称的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64553521/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com