springboot使用start集成es踩坑记录:不要使用严格动态

kun1790051360 / 2025-02-10 / 原文

在建立索引时,我使用了
"dynamic":"strict",

保证不会传入脏数据。

然后我使用了

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

来集成es

 

下面是我的java中的bean与mapper

@Data
@Document(indexName = "article")
@AllArgsConstructor
@NoArgsConstructor
public class ArticleDoc implements Serializable {
    @Id
    @Field(type = FieldType.Keyword)
    private Integer id;
    @Field(type = FieldType.Text)
    private String title;

    @Field(type = FieldType.Text)
    private String content;

    @Field(type = FieldType.Text, index = false)
    private String author;

    @Field(type = FieldType.Date, index = false)
    private String time;

    @Field(type = FieldType.Text)
    private String describe;

    //高亮封装
    @Transient
    private Map<String, List<String>> highlights;

}
@Repository
//泛型是Doc对象和ID的类型
public interface ArticleMapper extends ElasticsearchRepository<ArticleDoc, Integer> {
}

在插入索引时总是显示doc实体与es中的索引不匹配,后面重新修改了索引建立,发现插入时果然多了东西。

 原因是Spring Data Elasticsearch 默认会将文档的 Java 类名存储在 _class 字段中。这样,在查询结果返回时,Spring Data Elasticsearch 可以自动将 JSON 文档转换回对应的 Java 对象。

所以如果使用springdataes的话就要选择在建索引的时候要不不再使用strict,要不就在建立索引的时候填上_class