如何使用 spring-data-elasticsearch 避免文档中的“_class”字段

问题描述 投票:0回答:3

我正在为我的应用程序使用 spring-data-elasticsearch。我发现 spring 自动在我的所有文档中创建动态字段“_class”。我将索引配置为严格的动态映射。我希望某些属性能够从我的文档/映射中动态排除该字段。

有什么办法可以做到这一点吗?

spring-data-elasticsearch
3个回答
3
投票

在映射 pojo 中禁用

writeTypeHint

@Document(indexName = "index", writeTypeHint = WriteTypeHint.FALSE)
public class Test{}

Spring 文档参考

https://docs.spring.io/spring-data/elasticsearch/docs/4.3.0-M1/reference/html/#elasticsearch.mapping.meta-model.rules


2
投票

目前无法停用此功能。有一个未解决的问题可以添加此行为。

但是从下一个版本 (4.2.0.M5) 开始,当 Spring Data Elasticsearch 创建索引及其映射时,将在索引映射中定义

_class
属性 issue #1711


0
投票

根据 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) {}
}
© www.soinside.com 2019 - 2024. All rights reserved.