Как хранить перечисления Java с помощью spring-data-elasticsearch

#java #elasticsearch #spring-data-elasticsearch

#java #elasticsearch #spring-data-elasticsearch

Вопрос:

 public enum Smoking {
    NO("No"),YES("Yes");
}
  

Как хранить перечисления Java с помощью spring-data-elasticsearch, я хочу сохранить Yes, No и выполнить поиск того же

Ответ №1:

Вы можете сделать это, предоставив пользовательские конвертеры для вашего перечисления, чтобы преобразовать его из и в строку. Я полагаю, вы хотите, чтобы это свойство было ключевым словом в Elasticsearch и не анализировалось.

Вот реализация Smoking перечисления, в которую я добавил необходимые преобразователи в виде вложенных перечислений (я предпочитаю использовать перечисление как одноэлементную реализацию для преобразователей):

 import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter;
import org.springframework.data.convert.WritingConverter;

public enum Smoking {
    YES("yes"),
    NO("No");

    private String elasticsearchName;

    Smoking(String elasticsearchName) {
        this.elasticsearchName = elasticsearchName;
    }

    @WritingConverter
    public enum SmokingToStringConverter implements Converter<Smoking, String> {

        INSTANCE;

        @Override
        public String convert(Smoking source) {
            return source.elasticsearchName;
        }
    }

    @ReadingConverter
    public enum StringToSmokingConverter implements Converter<String, Smoking> {

        INSTANCE;

        @Override
        public Smoking convert(String source) {
            for (Smoking smoking : Smoking.values()) {
                if (smoking.elasticsearchName.equals(source)) {
                    return smoking;
                }
            }
            return null;
        }
    }
}
  

Преобразователи должны быть зарегистрированы, это можно сделать в классе configuration (см. Документацию о настройке клиента по адресу https://docs.spring.io/spring-data/elasticsearch/docs/4.0.4.RELEASE/reference/html/#elasticsearch.clients.rest ) путем добавления пользовательской реализации elasticsearchCustomConversions() :

 @Override
public ElasticsearchCustomConversions elasticsearchCustomConversions() {
    return new ElasticsearchCustomConversions(Arrays.asList(
        Smoking.SmokingToStringConverter.INSTANCE,
        Smoking.StringToSmokingConverter.INSTANCE)
    );
}
  

Затем вы будете использовать свой класс enum в своей сущности:

 @Field(type = FieldType.Keyword)
private Smoking smoking;
  

Вот и все, значения перечислений сохраняются в Elasticsearch в желаемой форме.