[Elastic][Elasticsearch] Painless
Updated:
개요
- https://www.elastic.co/guide/en/elasticsearch/painless/current/painless-guide.html
- 간단하고 안전한 스크립팅 언어
- script_fields를 이용하여 스크립트 기반의 검색 가능
예제
- 데이터
POST painless_test/_doc { "@timestamp": "2022-05-01T07:00:00.000Z", "cluster": "cluster-01", "resource": [ { "name": "node-01", "cpu": 1, "memory": 11, "disk": 111 }, { "name": "node-02", "cpu": 2, "memory": 22, "disk": 222 }, { "name": "node-03", "cpu": 3, "memory": 33, "disk": 333 } ] }
- 요청
GET painless_test/_search { "query": { "bool": { "must": [ { "range": { "@timestamp": { "gte": "2022-05-01T07:00:00.000Z", "lt": "2022-05-01T07:01:00.000Z" } } } ] } }, "script_fields": { "cluster": { "script": { "lang": "painless", "source": "params._source.cluster" } }, "name": { "script": { "lang": "painless", "source": "def list = new ArrayList(); for (item in params._source.resource) {list.add(item.name);} return list;" } }, "cpu_sum": { "script": { "lang": "painless", "source": "int sum = 0; for (item in params._source.resource) {sum += item.cpu;} return sum;" } }, "memory_sum": { "script": { "lang": "painless", "source": "int sum = 0; for (item in params._source.resource) {sum += item.memory;} return sum;" } }, "disk_sum": { "script": { "lang": "painless", "source": "int sum = 0; for (item in params._source.resource) {sum += item.disk;} return sum;" } }, "timestamp": { "script": { "lang": "painless", "source": "params._source['timestamp']" } } } }
- 응답
{ "took" : 8, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "painless_test", "_type" : "_doc", "_id" : "w2alaYABFxYHVJl7ArL4", "_score" : 1.0, "fields" : { "cluster" : [ "cluster-01" ], "cpu_sum" : [ 6 ], "name" : [ "node-01", "node-02", "node-03" ], "disk_sum" : [ 666 ], "memory_sum" : [ 66 ], "datacenter_id" : [ null ], "timestamp" : [ null ] } } ] } }