#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 в желаемой форме.