@Field 注解的默认值行为取决于几个因素,但核心原则是:当不显式配置时,Spring Data Elasticsearch (SDES) 会尝试自动推断类型,并使用一套默认的配置。


核心默认行为

如果一个字段只有 @Field 注解而没有指定任何属性,或者根本没有 @Field 注解,SDES 会启动自动类型映射

1. 没有 @Field 注解的字段: SDES 会根据 Java 字段的类型,自动映射到最接近的 Elasticsearch 数据类型。

Java 类型 默认映射的 Elasticsearch 类型 说明
String text 会被分词,同时自动创建一个 keyword 子字段用于精确匹配。
long, Long long
int, Integer integer
boolean, Boolean boolean
Date, Instant date
double, Double double
对象(如 Tag object
对象列表(如 List<Tag> nested 这是一个重要的例外! 集合类型默认会被映射为 nested 而不是 object

2. 只有 @Field 注解(空注解)的字段: 行为与上述完全相同。@Field 的存在只是显式地标记了这个字段需要被映射,但因为没有指定 type,所以依然使用自动推断。

// 以下两种方式的最终映射结果是一样的
private String title; // 自动映射为 text

@Field // 空注解,依然自动映射为 text
private String title;

各属性的默认值

当你使用了 @Field 并设置了 type 属性后,该类型下的其他属性会有其特定的默认值。

属性 默认值 说明
type FieldType.Auto (自动推断) 这是最核心的属性。如果不设置,就采用上面的自动映射规则。
analyzer 标准分析器 ("standard") 仅对 type = FieldType.Text 的字段有效。指定创建索引时使用的分词器。
searchAnalyzer analyzer 相同 仅对 type = FieldType.Text 的字段有效。指定搜索时使用的分词器。默认与 analyzer 一致。
fielddata false 是否允许对 text 字段进行排序、聚合。通常保持 false 以避免高昂的内存开销。对 Keyword 类型无意义。
format 无 (依赖于 ES 的默认日期格式) 仅对 type = FieldType.Date 的字段有效。定义日期的格式,如 "yyyy-MM-dd HH:mm:ss"
index true 字段是否被索引。如果设为 false,则该字段不可被搜索。
store false 是否单独存储字段值。通常不需要设置为 true,因为 _source 中已经包含了完整的文档。
ignoreAbove 256 仅对 Keyword 及相关类型有效。超过此长度的字符串将不会被索引或存储。

代码示例对比

让我们通过几个例子来直观理解:

public class ExampleEntity {

    // 情况1: 无任何注解。SDES自动映射。
    // 映射结果:ES类型为 `text`,并带一个 `keyword` 子字段。
    private String autoTitle;

    // 情况2: 空 @Field 注解。效果与情况1完全相同。
    @Field
    private String emptyAnnotationTitle;

    // 情况3: 显式指定为 Text 类型,但只用默认分词器。
    // 映射结果:ES类型为 `text`,使用标准分词器(standard analyzer)。
    @Field(type = FieldType.Text)
    private String standardTextTitle;

    // 情况4: 显式指定为 Text 类型,并使用IK中文分词器。
    @Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
    private String ikTextTitle;

    // 情况5: 显式指定为 Keyword 类型,用于精确匹配。
    @Field(type = FieldType.Keyword)
    private String category;

    // 情况6: 日期类型,使用默认日期格式。
    @Field(type = FieldType.Date)
    private Date createTime;

    // 情况7: 列表类型。SDES 默认会映射为 `nested` 类型,而不是 `object`。
    private List<Tag> tags; // 自动映射为 `nested`
}

总结

  • 最核心的默认行为是自动类型推断。这对于简单的字段(如数字、日期)通常工作得很好。
  • 对于 String 类型,默认映射为 text,这适用于全文搜索,但不适用于精确匹配、排序或聚合。如果你需要对一个字符串进行精确匹配(例如:状态、分类代码、标签名),必须显式地将其设置为 @Field(type = FieldType.Keyword)
  • 了解默认值的最佳方式是查看生成的索引映射。在应用程序启动后(或通过 ElasticsearchRestTemplate 创建索引后),你可以通过 Kibana 或 Elasticsearch 的 API (GET /your_index_name/_mapping) 来查看实际的映射结构,这会让你对默认行为了然于胸。