I am using an open source build of Elasticsearch, version 7.8.0.
I executed
curl -ivvk -H "Content-Type: application/json" -H "Accept: application/json" -u username:password -X PUT "https://localhost:9200/_template/test_template" -d '
{
  "index_patterns": ["test-*"],
  "template": {
    "settings": {
      "number_of_shards": 1,
      "index.refresh_interval": "5s"
    },
    "mappings": {
      "properties": {
        "status": {
    	  "type": "keyword"
        },
	"message": {
		  "type": "text"
	}
      }
    }
  }
}'
HTTP/1.1 200 OK
{"acknowledged":true}
curl -ivvk -H "Accept: application/json" -u username:password -X GET "https://localhost:9200/_cat/templates"
HTTP/1.1 200 OK
[{"name":"test_template","index_patterns":"[test-*]","order":"0","version":null,"composed_of":""}]
I then created the index, test-1, with a deliberate attempt to violate the intended mapping of status to keyword, by assigning an integer value to it:
curl -ivvk -H "Content-Type: application/json" -H "Accept: application/json" -u username:password -X POST "https://localhost:9200/test-1/_create/1" -d '
{
  "status": 7,
  "message": "This is a test."
}'
HTTP/1.1 201 Created
{"_index":"test-1","_type":"_doc","_id":"1","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}
When I inspected the mapping that was applied to test-1, I saw:
curl -ivvk -u username:password -H "Accept: application/json" "https://localhost:9200/test-1/_mapping?pretty"
HTTP/1.1 200
{
  "test-1" : {
    "mappings" : {
      "properties" : {
        "message" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "status" : {
          "type" : "long"
        }
      }
    }
  }
}
I realized the template was ignored since status had type, long, instead of keyword. Can someone tell me what I should be doing?