Creating Indices name Dynamically in Elasticsearch using Spring-Data Elasticsearch Creating Indices name Dynamically in Elasticsearch using Spring-Data Elasticsearch elasticsearch elasticsearch

Creating Indices name Dynamically in Elasticsearch using Spring-Data Elasticsearch


What I am doing in my project , we are storing index name and type name in DB whenever it gets changed .

Now i m getting index and type Dynamically in this manner:

First Solution

  • 1)In configuration file ,create a Bean returning a value for someProperty . Here I injected the somePropertyValue with @Value annotation from DB or property file :-

    @Value("${config.somePropertyValue}")private String somePropertyValue;@Beanpublic String somePropertyValue(){    return somePropertyValue;}
  • 2)After this , it is possible to inject the somePropertyValue into the @Document annotation like this :-

    @Document(index = "#{@somePropertyValue}")public class Foobar {    //...}

Second Solution

  • 1) create getter setter in bean :-

    @Componentpublic class config{     @Value("${config.somePropertyValue}")     private String somePropertyValue;     public String getSomePropertyValue() {       return somePropertyValue;     }    public void setSomePropertyValue(String somePropertyValue) {       this.somePropertyValue = somePropertyValue;    }}
  • 2)After this , it is possible to inject the somePropertyValue into the @Document annotation like this :-

    @Document(index = "#{config.somePropertyValue}")public class Foobar {    //...}


What I am doing on my application is that I use ElasticSearchTemplate to create my dynamic index name and then I point an alias to the new index I have created and then drop the old one.

esTemplate.createIndex(newIndexName, loadfromFromFile(settingsFileName));esTemplate.putMapping(newIndexName, "MYTYPE", loadfromFromFile(mappingFileName));

I'm not using the mapping and settings from my class since I need it to be dynamic.

    protected String loadFromFile(String fileName) throws IllegalStateException {       StringBuilder buffer = new StringBuilder(2048);       try {           InputStream is = getClass().getResourceAsStream(fileName);           LineNumberReader reader = new LineNumberReader(new InputStreamReader(is));           while (reader.ready()) {               buffer.append(reader.readLine());               buffer.append(' ');           }       } catch (Exception e) {           throw new IllegalStateException("couldn't load file " + fileName, e);       }       return buffer.toString();   }