我当前的项目需要有一个弹性搜索索引,该索引将按月滚动。索引名称应类似于Indexname-%{+YYYY.MM}
。
现在的问题是我正在使用Spring数据Elasticsearch与弹性搜索进行通信并执行Crud操作。目前为此,在我的域类中,我已进行了如下注释,
@Document(indexName = "indexname-2018.08", type = "Node")
public class Node {
......}
目前,我正在提供静态索引名称。 我的问题是如何使用索引的别名而不是直接的索引名称,例如下面的内容,
@Document(indexName = "indexname-current”, type = "Node")
其中indexname-current是所有Indexname-%{+YYYY.MM}
类型的索引的别名。
我真的被困在这里。任何帮助将不胜感激。
答案 0 :(得分:1)
Spring数据支持在索引名称中使用Spring表达式SPEL
您可以创建一个包含过渡策略的bean。
@Component("rollover")
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class RolloverStrategy {
private String monthlyDateFormat;
@PostConstruct
void after(){
Date date = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
monthlyDateFormat = formatter.format(date);
}
public String getMonthlyDateFormat() {
return monthlyDateFormat;
}
public void setMonthlyDateFormat(String monthlyDateFormat) {
this.monthlyDateFormat = monthlyDateFormat;
}
}
然后在您的课程中使用SPEL对此进行引用
@Document(indexName = "indexname-#{rollover.monthlyDateFormat}", type = "Node")
public class Node {}
答案 1 :(得分:0)
使用SPEL不会使用 rollover API ,IMO会更好。您还有其他选择:
在Java客户端/ spring-data-es中使用过渡API(只需创建一个创建过渡请求的日常例程-了解更多:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/master/java-rest-high-rollover-index.html)
创建一个别名-与您在示例中所做的相同,通过脚本进行滚动API调用,例如使用.json对服务器:9200 / index / _rollover的PUT请求:
{
"conditions": {
"max_age": "1d",
"max_docs" : 1000000
}
}
并每天使用cron作业或按应用程序(https://www.elastic.co/blog/managing-time-based-indices-efficiently)运行。
使用
@Document(indexName=yourAlias==Indexname, type=yourType)
spring-data-es将使用您创建的别名将新文档持久保存到现有的活动索引中,这意味着任何新文档将被保存到活动索引中,这将是您之前的翻转API调用创建的最新文档
答案 2 :(得分:0)
我通过Elasticsearch 7中可用的索引生命周期管理(ILM)解决了这个问题。您可以让Elastic为您自动进行过渡,并且只需引用Spring Data Elastic代码的别名即可。我为实体添加了注释:
@Document(indexName = "myAlias", createIndex = false)
然后,我添加了一些代码以在启动时调用ILM API,以确保一切都已设置并创建:
@Configuration
public class ElasticIndexConfiguration {
private RestHighLevelClient elasticsearchClient;
public ElasticIndexConfiguration(RestHighLevelClient elasticsearchClient) {
this.elasticsearchClient = elasticsearchClient;
}
@PostConstruct
public void postConstruct() {
// See ILM tutorial to:
// Create/update a lifecycle policy
// Create/update an index template that applies the lifecycle policy
// Bootstrap the initial time-series index / create the alias
}
}
我参考了ILM教程以及高级REST客户端的Java API: