Динамическое создание имен индексов в 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 { //... }