@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
) 来查看实际的映射结构,这会让你对默认行为了然于胸。