标准用法

elasticsearch 脚本化字段是根据索引中的数据实时计算而来。因为实时计算,所以会非常消耗资源。默认的脚本语言是Lucene 表达式 和 Painless,也支持其他的 Groovy、 Javascript 和 Python,但是不建议这么做,以后可能会废弃这些语言。

GET /_search
{
  "query" : {
    "match_all": {}
  },
  "script_fields" : {
    "test1" : {
        "script" : {
            "lang": "painless",
            "inline": "doc['my_field_name'].value * 2"
        }
    },
    "test2" : {
        "script" : {
            "lang": "painless",
            "inline": "doc['my_field_name'].value * factor",
            "params" : {
                "factor"  : 2.0
            }
        }
    },
    "timedifference": {
     "script": "doc['time.new_time'].value - doc['time.first_alert_time'].value"
     }
}
}

功能限制

1,不能用于另外一个script field
2,脚本字段只会给出符合查询的前N个文档的计算,也就是hits里面field。但是不能用在聚合或者查询中,因为脚本字段功能只会计算前N个文档。
如果想实现类似脚本字段聚合的功能,可以将脚本字段代码放到agg聚合里面

GET _search
{
    "size": 0,
    "aggs": {
      "id_host_status": {
      "terms": {
      "size": 0,
      "script": "if (doc['HOST_STATUS'].value == 'Closed_Adm' || doc['HOST_STATUS'].value == 'Closed_Full' ||  doc['HOST_STATUS'].value == 'Closed_LIM' ) { return 'Close'} else if(doc['HOST_STATUS'].value == 'Unavailable' || doc['HOST_STATUS'].value == 'Unavail'){return 'Unavail'} else { return doc['HOST_STATUS'].value} "
      }
     }
 }
}

简单提醒

Elasticsearch 支持脚本聚合,但是要时刻了解脚本带来的性能问题,不仅仅因为脚本执行造成速度慢,而且一些性能的优化,不再适用

  1. https://stackoverflow.com/questions/35869081/elasticsearch-aggregation-on-a-script-field
  2. https://stackoverflow.com/questions/25258024/using-elasticsearch-aggregations-on-script-field-values?rq=1
  3. https://discuss.elastic.co/t/how-to-use-a-script-field-inside-aggregate/191190
文章目录