首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用spring-data-elasticsearch存储java枚举

如何使用spring-data-elasticsearch存储java枚举
EN

Stack Overflow用户
提问于 2020-10-10 14:07:24
回答 1查看 598关注 0票数 2
代码语言:javascript
复制
public enum Smoking {
    NO("No"),YES("Yes");
}

如何使用spring-data-elasticsearch存储java枚举,我想存储Yes、No并搜索相同的枚举

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-10 18:28:36

为此,您可以为Enum提供自定义转换器,以便将其从字符串转换为字符串。我想您希望将此属性作为Elasticsearch中的关键字,而不是进行分析。

下面是Smoking枚举的一个实现,我在其中添加了必要的转换器作为嵌套枚举(我更喜欢使用枚举作为转换器的单一实现):

代码语言:javascript
复制
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;
        }
    }
}

需要注册转换器,这可以通过添加elasticsearchCustomConversions()的自定义实现在configuration类中完成(请参阅https://docs.spring.io/spring-data/elasticsearch/docs/4.0.4.RELEASE/reference/html/#elasticsearch.clients.rest上有关配置客户端的文档

代码语言:javascript
复制
@Override
public ElasticsearchCustomConversions elasticsearchCustomConversions() {
    return new ElasticsearchCustomConversions(Arrays.asList(
        Smoking.SmokingToStringConverter.INSTANCE,
        Smoking.StringToSmokingConverter.INSTANCE)
    );
}

然后在实体中使用枚举类:

代码语言:javascript
复制
@Field(type = FieldType.Keyword)
private Smoking smoking;

仅此而已,枚举值以所需的形式存储在Elasticsearch中。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64290524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档