【问题标题】:Creating Indices name Dynamically in Elasticsearch using Spring-Data Elasticsearch使用 Spring-Data Elasticsearch 在 Elasticsearch 中动态创建索引名称
【发布时间】:2015-11-24 13:11:07
【问题描述】:

我有一个用例,需要每月在 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;
}   

但这并没有按预期工作。我也在尝试其他一些事情。但我愿意接受建议。也可以随意评论我目前的方法,它是否有效。如果需要更多详细信息,请告诉我。

【问题讨论】:

    标签: java spring elasticsearch spring-batch spring-data-elasticsearch


    【解决方案1】:

    我在我的项目中所做的是,每当索引名称和类型名称发生更改时,我们都会将其存储在数据库中。

    现在我正在以这种方式动态获取索引和类型:

    第一个解决方案

    • 1) 在配置文件中,创建一个返回 someProperty 值的 Bean。在这里,我从 DB 或属性文件中注入了带有 @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 {
          //...
      }
      

    【讨论】:

    • 我必须将spring-data-commons 添加到我的项目中才能使用org.springframework.data.spel.ExpressionDependencies。这不包括在spring-data-elasticsearch
    【解决方案2】:

    我在我的应用程序上做的是使用 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();
       }
    

    【讨论】:

    • 感谢蒂亚戈的回复,我会试试这个。只是为了确认 loadFromFile(mapping/setting) 将返回 JSON 格式的字符串,对吗?您还可以分享将索引添加到别名的代码 sn-p。我正在尝试使用 AliasQueryBuild 和 AliasQuery 你是使用相同的东西还是有其他方法。
    • @sagar27 该方法现在就在那里。
    • 这对我有用,传递 JSON 映射文件而不是模型对象。到目前为止,使用 Alias 获取数据也可以正常工作。谢谢蒂亚戈。
    • @Thiago 所以我可以在没有属性indexName 的实体上定义@Document 注释?这种方法是否存在任何配置问题?
    • 你可以,你只是不必使用它。我没有遇到任何配置问题
    猜你喜欢
    • 2016-11-01
    • 2017-12-17
    • 2015-05-04
    • 1970-01-01
    • 2021-11-03
    • 2021-08-15
    • 2021-12-24
    • 2021-05-11
    • 1970-01-01
    相关资源
    最近更新 更多