Elasticsearch聚合按_key排序

时间:2018-06-15 06:34:29

标签: elasticsearch

我使用的是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?
      }
    }
  },

1 个答案:

答案 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;}"
          }
        }
      }
    }
  }
}