Spring Data Elasticsearch:@Field和非@Field都被编入索引

时间:2015-08-14 00:54:18

标签: spring elasticsearch spring-data

我选择使用@Entity类来标记@Document,这样可以节省维护DTO的开销。

现在,当尝试将弹性搜索索引到这些实体时,它们被存储为具有所有属性的弹性(除非我用@JsonIgnore明确标记那些不需要的东西)。

任何人都可以向我解释究竟发生了什么,以及是否可以选择性地选择特定属性。

注意:将其中一些标记为@Field没有任何区别

3 个答案:

答案 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的字段。但是:

  1. 它们没有编入索引,也没有出现在映射中
  2. Spring数据(一个不那么成熟且如此有价值的项目)默认情况下Jsonizes所有字段,所以问题是Spring Data,正如您所说,但是您可以将复制解决方案添加到实体中: @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 批注定义字段属性,而不是其在映射中的存在。

如果您不想映射变量,则有(至少)两个选项:

  1. 使用 @JsonIgnore 注释
  2. 使用 @Mapping 导入映射文件。在映射文件中,禁用动态映射-https://www.elastic.co/guide/en/elasticsearch/guide/current/dynamic-mapping.html