Skip to main content

Command Palette

Search for a command to run...

Runtime Field in Elasticsearch

Published
2 min read

Let's explore another feature of Elasticsearch, where you can build new fields based on currently available fields.

For Example, if you have fields named first_name and second_name but in the response, you need a field named full_name. You can simply use script_fields.

Define an index mapping with a field that will be used for the runtime field calculation. Here's a sample mapping for an index named my_index:

PUT my_index
{
  "mappings": {
    "properties": {
      "field1": {
        "type": "keyword"
      },
      "field2": {
        "type": "keyword"
      }
    }
  }
}

Index some documents with values in "first_name" and "second_name":

POST my_index/_doc/1
{
  "first_name": "John",
  "second_name": "Doe"
}

POST my_index/_doc/2
{
  "first_name": "Jane",
  "second_name": "Smith"
}

Perform a search query with a script_fields parameter to create the "full_name" runtime field based on the existing fields:

GET my_index/_search
{
  "query": {
    "match_all": {}
  },
  "script_fields": {
    "full_name": {
      "script": {
        "source": "params['_source']['first_name'] + ' ' + params['_source']['second_name']",
        "lang": "painless"
      }
    }
  }
}

The response will include the original documents along with the newly created "full_name" field:

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 2,
      "relation": "eq"
    },
    "max_score": 1.0,
    "hits": [
      {
        "_index": "my_index",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.0,
        "_source": {
          "first_name": "John",
          "second_name": "Doe"
        },
        "fields": {
          "full_name": [
            "John Doe"
          ]
        }
      },
      {
        "_index": "my_index",
        "_type": "_doc",
        "_id": "2",
        "_score": 1.0,
        "_source": {
          "first_name": "Jane",
          "second_name": "Smith"
        },
        "fields": {
          "full_name": [
            "Jane Smith"
          ]
        }
      }
    ]
  }
}

Thats It! It's simple!

If you have any other ideas or suggestions, please do share them in the comments or connect with me on Twitter.

More from this blog

Smit Shah's Blog

30 posts