Elastic/Elasticsearch: runtime_mappings
개요
- https://www.elastic.co/guide/en/elasticsearch/reference/current/runtime-search-request.html
- 검색 요청 시 runtime fields 정의
- 검색 요청에 runtime_mappings를 지정하여 쿼리의 일부로만 존재하는 runtime fields를 생성
- mapping에 runtime fields를 추가하는 것처럼 스크립트를 runtime_mappings 섹션의 일부로 지정
예제
- 데이터
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": {
"match_all": {}
},
"_source": [
"fields"
],
"fields": [
"cpu_sum",
"timestamp"
],
"runtime_mappings": {
"cpu_sum": {
"type": "double",
"script": "double sum = 0; for (item in params._source.resource) {sum += item.cpu;} emit(sum);"
},
"timestamp": {
"type": "keyword",
"script": "emit(doc['@timestamp'].value.toString());"
}
}
}
- 응답
{
"took": 1,
"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": "xGa2aYABFxYHVJl737Jm",
"_score": 1.0,
"_source": {},
"fields":
{ "cpu_sum": [6.0], "timestamp": ["2022-05-01T07:00:00.000Z"] },
},
],
},
}