我正在为我的应用程序使用 spring-data-elasticsearch。我发现 spring 自动在我的所有文档中创建动态字段“_class”。我将索引配置为严格的动态映射。我希望某些属性能够从我的文档/映射中动态排除该字段。
有什么办法可以做到这一点吗?
在映射 pojo 中禁用
writeTypeHint
。
@Document(indexName = "index", writeTypeHint = WriteTypeHint.FALSE)
public class Test{}
Spring 文档参考
目前无法停用此功能。有一个未解决的问题可以添加此行为。
但是从下一个版本 (4.2.0.M5) 开始,当 Spring Data Elasticsearch 创建索引及其映射时,将在索引映射中定义
_class
属性 issue #1711。
根据 Spring 文档,这称为类型提示。可以通过提及
来禁用此功能,特别是对于某个对象@Document(indexName = "index", writeTypeHint = WriteTypeHint.FALSE)
也可以通过重写以下方法对所有对象禁用此功能
@Configuration
public class ElasticSearchConfig extends ElasticsearchConfiguration {
@Override
public ClientConfiguration clientConfiguration() {
return ClientConfiguration.builder()
.connectedTo("localhost:9200")
.build();
}
@Override
protected boolean writeTypeHints() {
return false;
}
}
这些在 spring 文档中提到。 https://docs.spring.io/spring-data/elasticsearch/reference/elasticsearch/object-mapping.html
但是,上述技术都不适合我抛出异常引起:com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段“_class”
相反,我为“_class”创建了一个setter方法并将其标记为ReadOnlyProperty。这只会从elasticstore中读取,但不会向elasticstore写入任何值。
@Document(indexName = "ELASTIC_SEARCH_INDEX_NAME", writeTypeHint = WriteTypeHint.FALSE)
public class ESDTO implements Serializable {
@Field
@ReadOnlyProperty
@AccessType(AccessType.Type.PROPERTY)
public void set_class(String _class) {}
}