如何在Spring-dat-elasticsearch中提供Domain类中的索引别名而不是索引名称

时间:2018-08-02 08:25:54

标签: spring-data-elasticsearch

我当前的项目需要有一个弹性搜索索引,该索引将按月滚动。索引名称应类似于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}类型的索引的别名。

我真的被困在这里。任何帮助将不胜感激。

3 个答案:

答案 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会更好。您还有其他选择:

  1. 在Java客户端/ spring-data-es中使用过渡API(只需创建一个创建过渡请求的日常例程-了解更多:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/master/java-rest-high-rollover-index.html

  2. 创建一个别名-与您在示例中所做的相同,通过脚本进行滚动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: