我选择使用@Entity类来标记@Document,这样可以节省维护DTO的开销。
现在,当尝试将弹性搜索索引到这些实体时,它们被存储为具有所有属性的弹性(除非我用@JsonIgnore明确标记那些不需要的东西)。
任何人都可以向我解释究竟发生了什么,以及是否可以选择性地选择特定属性。
注意:将其中一些标记为@Field没有任何区别
答案 0 :(得分:1)
我找到了一个可能对某些人有用的解决方法。
<强> 1。创建自定义EntityMapper
EntityMapper是spring数据elasticsearch包org.springframework.data.elasticsearch.core
附带的一个接口,默认情况下,该接口有一个实现类,名为DefaultEntityMapper
,有两种方法可以覆盖。
public String mapToString(Object object)抛出IOException;
SimpleFilterProvider filters = new SimpleFilterProvider();
filters.setDefaultFilter(SimpleBeanPropertyFilter.filterOutAllExcept(fieldsNotToFilter));
filters.setFailOnUnknownId(false);
String dtoAsString = objectMapper.writer(filters).writeValueAsString(object);
请注意,您需要 @JsonFilter(&#34; filterName&#34;)注释来标记实体类。
<强> 2。将创建的CustomEntityMapper注入elasticsearch:transport-client bean name =&#34; entityMapper&#34;类=&#34; com.modym.core.search.CustomEntityMapper
答案 1 :(得分:1)
你是对的,也包括没有@Field
的字段。但是:
@Document( indexName = INDEX_NAME, type = TYPE, shards = 1, replicas = 0 )
@JsonIgnoreProperties( value = {"field1", "field2", ..., "fieldN"} )
public class Entity {
答案 2 :(得分:1)
请参见https://docs.spring.io/spring-data/elasticsearch/docs/3.2.4.RELEASE/reference/html/#elasticsearch.mapping.meta-model.annotations中的字段说明,其中指出:
@Field:应用于字段级别并定义字段的属性,大多数属性映射到各自的Elasticsearch映射定义
即 @Field 批注定义字段属性,而不是其在映射中的存在。
如果您不想映射变量,则有(至少)两个选项: