Динамическое создание имен индексов в Elasticsearch с помощью Spring-Data Elasticsearch

у меня есть прецедент, когда нужно создавать индексы в месяц в 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;
}   

но это работает не так, как ожидалось. Я пробую и кое-что другое. Но я открыт для предложений. Также не стесняйтесь комментировать мой текущий подход, будет ли он работать или нет. Пожалуйста, дайте мне знать, если любой требуется более подробная информация.

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();
   }

что я делаю в своем проекте, мы храним имя индекса и имя типа в БД всякий раз, когда он изменяется .

теперь я получаю индекс и набираю динамически следующим образом:

Первый Вариант

  • 1) в файле конфигурации создайте компонент ,возвращающий значение для someProperty . Здесь я ввел somePropertyValue с аннотацией @Value из DB или файла свойств: -

    @Value("${config.somePropertyValue}")
    private String somePropertyValue;
    
    @Bean
    public String somePropertyValue(){
        return somePropertyValue;
    }
    
  • 2)После этого возможно ввести somePropertyValue в аннотацию @Document следующим образом: -

    @Document(index = "#{@somePropertyValue}")
    public class Foobar {
        //...
    }
    

Второй Вариант

  • 1) создать геттер сеттер в bean: -

    @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 {
        //...
    }