使用 Spring-Data Elasticsearch 在 Elasticsearch 中动态创建索引名称
Creating Indices name Dynamically in Elasticsearch using Spring-Data Elasticsearch
我有一个用例需要在 Elasticsearch 中每月创建索引。这个想法是在月度基础上创建索引,以便它们易于维护,并且可以在 expired.For 时删除,以实现我已经使用了 spring-batch 并且有一个月度工作将创建月度指数 对于 Elasticsearch-Java 集成,我使用了 Spring-Data Elasticsearch 实现。我现在面临的问题是,我无法弄清楚如何使用 Entity 对象为索引和映射提供动态名称。我当前的实施是在牢记单一索引的情况下完成的。请找到我用来创建索引的以下代码
elasticsearchTemplate.createIndex(SingleChat.class);
elasticsearchTemplate.putMapping(SingleChat.class);
elasticsearchTemplate.refresh(SingleChat.class, true);
SingleChat 是我的实体Class
@Document(indexName="singlemsgtemp_#{jobParameters['MONTH']}",type="singlechat")
public class SingleChat {
@org.springframework.data.annotation.Id
String Id;
@Field(type = FieldType.String)
String conservationId;
@Field(type = FieldType.String)
String from;
@Field(type = FieldType.String)
String to;
@Field(type = FieldType.String)
String msgContent;
@Field(type = FieldType.String)
String sessionId;
@Field(type = FieldType.Date, index = FieldIndex.not_analyzed, store = true, format = DateFormat.date_hour_minute_second_millis)
Date postedDate;
@Field(type = FieldType.Date, index = FieldIndex.not_analyzed, store = true, format = DateFormat.date_hour_minute_second_millis)
Date expireDate;
}
但这没有按预期工作。我也在尝试其他一些东西。但我愿意接受建议。也可以随意评论我目前的方法,它是否有效。如果需要更多详细信息,请告诉我。
我在我的应用程序上做的是使用 ElasticSearchTemplate 创建我的动态索引名称,然后我将一个别名指向我创建的新索引,然后删除旧索引。
esTemplate.createIndex(newIndexName, loadfromFromFile(settingsFileName));
esTemplate.putMapping(newIndexName, "MYTYPE", loadfromFromFile(mappingFileName));
我没有使用 class 中的映射和设置,因为我需要它是动态的。
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();
}
我在我的项目中所做的是,每当索引名称和类型名称发生更改时,我们都会将其存储在数据库中。
现在我正在以这种方式动态获取索引和类型:
第一个解决方案
1)在配置文件中,创建一个返回 someProperty 值的 Bean。在这里,我从数据库或 属性 文件中注入了带有 @Value 注释的 somePropertyValue :-
@Value("${config.somePropertyValue}")
private String somePropertyValue;
@Bean
public String somePropertyValue(){
return somePropertyValue;
}
2)在此之后,可以像这样将 somePropertyValue 注入到 @Document 注释中:-
@Document(index = "#{@somePropertyValue}")
public class Foobar {
//...
}
第二种解决方案
1) 在 bean 中创建 getter setter :-
@Component
public class config{
@Value("${config.somePropertyValue}")
private String somePropertyValue;
public String getSomePropertyValue() {
return somePropertyValue;
}
public void setSomePropertyValue(String somePropertyValue) {
this.somePropertyValue = somePropertyValue;
}
}
2)在此之后,可以将 somePropertyValue 注入到
像这样的@Document 注释:-
@Document(index = "#{config.somePropertyValue}")
public class Foobar {
//...
}
我有一个用例需要在 Elasticsearch 中每月创建索引。这个想法是在月度基础上创建索引,以便它们易于维护,并且可以在 expired.For 时删除,以实现我已经使用了 spring-batch 并且有一个月度工作将创建月度指数 对于 Elasticsearch-Java 集成,我使用了 Spring-Data Elasticsearch 实现。我现在面临的问题是,我无法弄清楚如何使用 Entity 对象为索引和映射提供动态名称。我当前的实施是在牢记单一索引的情况下完成的。请找到我用来创建索引的以下代码
elasticsearchTemplate.createIndex(SingleChat.class);
elasticsearchTemplate.putMapping(SingleChat.class);
elasticsearchTemplate.refresh(SingleChat.class, true);
SingleChat 是我的实体Class
@Document(indexName="singlemsgtemp_#{jobParameters['MONTH']}",type="singlechat")
public class SingleChat {
@org.springframework.data.annotation.Id
String Id;
@Field(type = FieldType.String)
String conservationId;
@Field(type = FieldType.String)
String from;
@Field(type = FieldType.String)
String to;
@Field(type = FieldType.String)
String msgContent;
@Field(type = FieldType.String)
String sessionId;
@Field(type = FieldType.Date, index = FieldIndex.not_analyzed, store = true, format = DateFormat.date_hour_minute_second_millis)
Date postedDate;
@Field(type = FieldType.Date, index = FieldIndex.not_analyzed, store = true, format = DateFormat.date_hour_minute_second_millis)
Date expireDate;
}
但这没有按预期工作。我也在尝试其他一些东西。但我愿意接受建议。也可以随意评论我目前的方法,它是否有效。如果需要更多详细信息,请告诉我。
我在我的应用程序上做的是使用 ElasticSearchTemplate 创建我的动态索引名称,然后我将一个别名指向我创建的新索引,然后删除旧索引。
esTemplate.createIndex(newIndexName, loadfromFromFile(settingsFileName));
esTemplate.putMapping(newIndexName, "MYTYPE", loadfromFromFile(mappingFileName));
我没有使用 class 中的映射和设置,因为我需要它是动态的。
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();
}
我在我的项目中所做的是,每当索引名称和类型名称发生更改时,我们都会将其存储在数据库中。
现在我正在以这种方式动态获取索引和类型:
第一个解决方案
1)在配置文件中,创建一个返回 someProperty 值的 Bean。在这里,我从数据库或 属性 文件中注入了带有 @Value 注释的 somePropertyValue :-
@Value("${config.somePropertyValue}") private String somePropertyValue; @Bean public String somePropertyValue(){ return somePropertyValue; }
2)在此之后,可以像这样将 somePropertyValue 注入到 @Document 注释中:-
@Document(index = "#{@somePropertyValue}") public class Foobar { //... }
第二种解决方案
1) 在 bean 中创建 getter setter :-
@Component public class config{ @Value("${config.somePropertyValue}") private String somePropertyValue; public String getSomePropertyValue() { return somePropertyValue; } public void setSomePropertyValue(String somePropertyValue) { this.somePropertyValue = somePropertyValue; } }
2)在此之后,可以将 somePropertyValue 注入到 像这样的@Document 注释:-
@Document(index = "#{config.somePropertyValue}") public class Foobar { //... }