我正在使用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/

10-12 00:24
查看更多