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(); }