gpt4 book ai didi

elasticsearch - Elasticsearch聚合按_key排序

转载 作者:行者123 更新时间:2023-12-03 01:37:52 24 4
gpt4 key购买 nike

我正在使用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?
}
}
},

最佳答案

由于您的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;}"
}
}
}
}
}
}

关于elasticsearch - Elasticsearch聚合按_key排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50870267/

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