如何使用 spring-data-elasticsearch 存储 java 枚举
How to store java enums using spring-data-elasticsearch
public enum Smoking {
NO("No"),YES("Yes");
}
如何使用 spring-data-elasticsearch 存储 java 枚举,我想存储是,否并搜索相同的内容
您可以通过为您的 Enum 提供自定义转换器来将其与 String 相互转换。我想您希望将此 属性 作为 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;
}
}
}
转换器需要注册,这可以在配置 class 中完成(请参阅 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)
);
}
然后您将在您的实体中使用您的枚举 class:
@Field(type = FieldType.Keyword)
private Smoking smoking;
就是这样,枚举值以所需的形式存储在 Elasticsearch 中。
public enum Smoking {
NO("No"),YES("Yes");
}
如何使用 spring-data-elasticsearch 存储 java 枚举,我想存储是,否并搜索相同的内容
您可以通过为您的 Enum 提供自定义转换器来将其与 String 相互转换。我想您希望将此 属性 作为 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;
}
}
}
转换器需要注册,这可以在配置 class 中完成(请参阅 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)
);
}
然后您将在您的实体中使用您的枚举 class:
@Field(type = FieldType.Keyword)
private Smoking smoking;
就是这样,枚举值以所需的形式存储在 Elasticsearch 中。