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

Rpj*_*Rpj 3 java elasticsearch spring-data-elasticsearch

public enum Smoking {
    NO("No"),YES("Yes");
}
Run Code Online (Sandbox Code Playgroud)

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

P.J*_*sch 5

您可以通过为枚举提供自定义转换器来将其与字符串相互转换来实现此目的。我想您希望将此属性作为 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

转换器需要注册,这可以在配置类中完成(请参阅有关配置客户端的文档: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)
    );
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在实体中使用枚举类:

@Field(type = FieldType.Keyword)
private Smoking smoking;
Run Code Online (Sandbox Code Playgroud)

就这样,枚举值以所需的形式存储在 Elasticsearch 中。