web-dev-qa-db-ja.com

Spring-DataElasticsearchを使用してElasticsearchで動的にインデックス名を作成する

Elasticsearchで月ごとのインデックスを作成する必要があるユースケースがあります。アイデアは、メンテナンスが簡単で、期限切れになったときに削除できるように、月次ベースでインデックスを作成することです。これを実現するために、私はスプリングバッチを使用し、月次ベースでインデックスを作成する月次ジョブを持っています。 -Java統合Spring-DataElasticsearchの実装を使用しました。私が今直面している問題は、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;
}   

しかし、これは期待どおりに機能していません。私は他のことも試しています。しかし、私は提案を受け付けています。また、私の現在のアプローチについてコメントしてください。うまくいくかどうか。さらに詳細が必要な場合はお知らせください。

10
sagar27

私がアプリケーションで行っているのは、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();
   }
4
Thiago

私がプロジェクトで行っていることは、インデックス名とタイプ名が変更されるたびにDBに保存することです。

今、私はこの方法で動的にインデックスとタイプを取得しています:

最初の解決策

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

2番目の解決策

  • 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 {
        //...
    }
    
4
Vijay Gupta