Disabling field analyzing by default in elastic search

From elasticsearch 5.x string type is disabled. Instead elasticsearch has introduced two types text and keyword. Read this blog for the reasons for migrating data https://www.elastic.co/blog/strings-are-dead-long-live-strings

So instead of adding a template to disable analyzer, you could simply use field.keyword for exact search. e.g. If field name is fullName, and you have entries

  1. fullName:"John Doe"
  2. fullName:"John"

then, fullName:"John" will return two results, while fullName.keyword:"John" will return single record.

Just in case, you still want to disable text field, you can use the below dynamic template,

PUT _template/disable_all_analyzer
   {
     "template": "*",
     "mappings": {
       "_default_": {
           "dynamic_templates": [
               { "notanalyzed": {
                     "match":              "*", 
                     "match_mapping_type": "string",
                     "mapping": {
                         "type":        "keyword"
                     }
                  }
               }
             ]
          }
      }
   }

Cheers!!!


Yes - have a look at dynamic templates

Try the following:

PUT /my_index
{
  "mappings": {
    "my_type": {
        "dynamic_templates": [
            { "notanalyzed": {
                  "match":              "*", 
                  "match_mapping_type": "string",
                  "mapping": {
                      "type":        "string",
                      "index":       "not_analyzed"
                  }
               }
            }
          ]
       }
   }
}

The dynamic template is for new fields that aren't covered by your mapping - from the docs:

With dynamic_templates, you can take complete control over the mapping that is generated for newly detected fields.

You can also vary the mapping according to the field name, e.g. use "match": "*_data", to have a different set of mappings for field names ending in "_data".