我有一个用例,需要每月在Elasticsearch中创建索引。这个想法是在月度基础上创建索引,以便它们易于维护并且可以在过期时删除。为此,我使用了spring- batch并有一个月度工作,它将按月基础创建索引以供Elasticsearch使用-Java集成我已经使用了Spring-Data Elasticsearch实现。我现在面临的问题是,我无法弄清楚如何使用Entity对象为索引和映射提供动态名称。我当前的实现已牢记单个索引。请找到以下我用来创建索引的代码
elasticsearchTemplate.createIndex(SingleChat.class); elasticsearchTemplate.putMapping(SingleChat.class); elasticsearchTemplate.refresh(SingleChat.class, true);
而SingleChat是我的实体类
@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));
我没有使用班级中的映射和设置,因为我需要它是动态的。
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(); }