Elastic/Elasticsearch: Painless
개요
- 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],
},
},
],
},
}