1
votes

Many of the string fields in my application need to be mapped dynamically in elasticsearch 5.3. All new fields that end in id or ids should be mapped and indexed automatically by elastic as such:

 "_my_propertyId": 
 {
    "type": "keyword"
 }

I defined a dynamic template for the index/type like this

  "mappings": {
     "my_type": {
        "dynamic_templates": [
           {
              "id_as_keywords": {
                 "match": "*id|*Id|*Ids",
                 "match_mapping_type": "string",
                 "mapping": {
                    "type": "keyword"
                 }
              }
           }
        ]

Yet, elastic still creates the properties like this:

       "_someIds": {
          "type": "text",
          "fields": {
             "keyword": {
                "type": "keyword",
                "ignore_above": 256
             }
          }
       }

I'm not sure what i'm doing wrong or why this is the default mapping for dynamic string fields now. However, I need to be able dynamically map all properties that end in id or ids as keywords, without ignore_above and fully indexed so I can search for them using the searchAPI. Ideas? Why is this the default string mapping now (I understand the introduction of keyword/text, but still)?

Update

Found a good article on these default settings:

Strings

1

1 Answers

1
votes

You can use match_pattern parameter to have more control on match parameter. Find the updated dynamic template below:

"dynamic_templates": [
          {
            "id_as_keywords": {
              "match_mapping_type": "string",
              "match_pattern": "regex",
              "match": ".*(id|Id|Ids)",
              "mapping": {
                "type": "keyword"
              }
            }
          }
        ]

You can read more about match_pattern here.