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

У меня есть вариант использования, когда нужно создавать индексы в месяц в Elasticsearch. Идея состоит в том, чтобы создавать индексы на ежемесячной основе, чтобы их было легко поддерживать и чтобы их можно было удалить по истечении срока действия. Для этого я использовал весенний пакет и выполнял ежемесячное задание, которое будет создавать индексы на ежемесячной основе. Для 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;
}   

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


person sagar27    schedule 24.11.2015    source источник


Ответы (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();
   }
person Thiago    schedule 24.11.2015
comment
Спасибо Тиаго за ответ, я попробую этот. Просто чтобы подтвердить, что loadFromFile (отображение/настройка) вернет строку в формате JSON, верно? А также не могли бы вы поделиться фрагментом кода для добавления индекса в псевдоним. Я пытаюсь, используя AliasQueryBuild и AliasQuery, вы используете одно и то же или есть какой-то другой способ. - person sagar27; 25.11.2015
comment
@sagar27 sagar27 метод уже есть. - person Thiago; 25.11.2015
comment
Это сработало для меня, передав файл сопоставления JSON вместо объекта модели. Также на данный момент работает извлечение данных с использованием псевдонима. Спасибо Тьяго. - person sagar27; 26.11.2015
comment
@Thiago, чтобы я мог определить аннотацию @Document для своего объекта без свойства indexName? Есть ли проблемы с конфигурацией при таком подходе? - person andPat; 15.01.2016
comment
вы можете, вы просто не должны использовать его. У меня не было проблем с конфигурацией - person Thiago; 21.01.2016
comment
Могу я спросить вас что-то? Как вы загружаете файл json? Какой это метод? Не могли бы вы обновить свой пост с этим? - person Carlos Vázquez Losada; 01.02.2018

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

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

Первое решение

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

    @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 {
        //...
    }
    
person Vijay    schedule 06.04.2017