Elasticsearch 字段映射与数据类型
Elasticsearch 字段映射与数据类型
- 前言
- @Field 注解的 type 属性
- 1. FieldType.Keyword
- 2. FieldType.Text (默认分词器)
- 3. FieldType.Text (自定义分词器)
- 4. FieldType.Integer
- 5. FieldType.Long
- 6. FieldType.Double
- 7. FieldType.Float
- 8. FieldType.Boolean
- 9. FieldType.Date
- 10. FieldType.IP
- 11. FieldType.Object
- 12. FieldType.GeoPoint
- 13. FieldType.Nested
- 14. FieldType.Binary
- 总结
前言
在 Elasticsearch 中,@Field
注解的 type
属性用于指定字段的数据类型。不同的字段类型会影响 Elasticsearch 对数据的存储方式、索引方式以及查询方式。以下是 @Field
中常见的字段类型(FieldType)及其详解。
@Field 注解的 type 属性
1. FieldType.Keyword
-
用途:适用于需要精确匹配的字段,例如 ID、标签、分类、状态等不需要分词的字符串。
-
特点:
-
不会被分词,整个字符串作为一个单一的词项存储。
-
支持精确匹配(
term
查询、match
查询不适用)。 -
对于字段值不会分割成多个词项,适合用于聚合(
aggs
)、排序(sort
)等操作。
-
-
适用场景:
- 用于存储用户的唯一标识符(如
user_id
)、分类名称、状态字段等。
- 用于存储用户的唯一标识符(如
@Field(type = FieldType.Keyword)
private String status;
2. FieldType.Text (默认分词器)
-
用途:
- 适用于存储需要进行全文检索的文本字段。
- 当你使用 FieldType.Text 时,Elasticsearch 会自动为该字段使用默认的分词器来进行分词处理。
-
特点:
-
会被分词器分割成多个词项。
-
支持模糊查询、短语查询、范围查询等全文搜索功能。
-
Elasticsearch 会为其创建倒排索引,可以支持高效的全文检索和分析。
-
-
默认分词器:
- Elasticsearch 默认使用
standard
分词器,这个分词器会将文本按空格、标点符号等进行分割,并将文本转化为多个小的词项(tokens)。例如,中文文本会被按照一定规则分割成词,英文文本会被分割成单词。
- Elasticsearch 默认使用
-
适用场景:
- 用于存储文章内容、产品描述、评论等需要全文搜索的文本,适合一般的全文检索场景,特别是英文文本的处理。
-
示例(使用默认 standard 分词器):
@Field(type = FieldType.Text, analyzer = "standard") private String content;
默认行为:如果你存储的是英文文本,Elasticsearch 会自动使用
standard
分词器将文本切分成多个单词进行索引。在检索时,用户可以通过match
查询、wildcard
查询等进行高效的全文搜索。
3. FieldType.Text (自定义分词器)
-
用途:
- 用于存储需要特定分词器处理的文本字段。
- 当你需要自定义分词行为时,可以使用自定义的分词器。这时,你不仅可以指定一个特定的分词器,还可以配置分词器的具体行为,或者使用多个分析器链组合起来来达到更好的文本处理效果。
-
特点:
-
可以指定自定义的分词器,例如使用 ik_max_word 分词器处理中文文本。
-
支持更细粒度的分词和检索控制。
-
-
自定义分词器:
- 你可以定义一个自定义的分词器(
analyzer
),这个分词器可以根据你的需求使用不同的分词规则,处理文本时的方式可以是自定义的。例如,使用中文分词器(如ik_max_word
)来更好地处理中文文本,或使用keyword
分词器来处理特定的关键字。
- 你可以定义一个自定义的分词器(
-
适用场景:
-
当文本的语言和内容特殊,或者你希望对不同文本进行定制化处理时,比如:
-
中文文本的分词(通常需要使用
ik_max_word
或ik_smart
)。 -
特定领域的文本处理,如专有名词或术语的处理。
-
忽略大小写、移除停用词、词干提取等。
-
-
-
示例(使用自定义分析器):
@Field(type = FieldType.Text, analyzer = "ik_max_word") private String description;
自定义行为:使用
ik_max_word
分词器会把中文文本进行更细粒度的分词,例如将"平板电脑"
分词成"平板"
和"电脑"
。这种方式对中文文本的处理效果会比默认的standard
分词器更好。
4. FieldType.Integer
-
用途:用于存储整数类型数据。
-
特点:
-
存储整数值,适合用于存储诸如年龄、数量等数据。
-
可以进行范围查询、排序和聚合操作。
-
支持高效的数值查询。
-
-
适用场景:
- 用于存储整型数据,如
age
、price
等。
- 用于存储整型数据,如
@Field(type = FieldType.Integer)
private int age;
5. FieldType.Long
-
用途:用于存储长整型数据。
-
特点:
- 存储较大的整数值,支持范围查询、排序和聚合。
-
适用场景:
- 用于存储时间戳、大数量值等,如 Unix 时间戳。
@Field(type = FieldType.Long)
private long timestamp;
6. FieldType.Double
-
用途:用于存储双精度浮点数类型数据。
-
特点:
-
存储小数值,可以用于存储价格、评分等数据。
-
支持数值范围查询、聚合等操作。
-
-
适用场景:
- 用于存储价格、评分、测量值等浮动值。
@Field(type = FieldType.Double)
private double price;
7. FieldType.Float
-
用途:用于存储单精度浮点数数据。
-
特点:
-
存储较小范围的浮点数值,适合占用更少的内存。
-
用于低精度要求的浮动值。
-
-
适用场景:
- 用于存储浮动数据,如 float 类型的评分、比例等。
@Field(type = FieldType.Float)
private float rating;
8. FieldType.Boolean
-
用途:用于存储布尔类型数据(true 或 false)。
-
特点:
-
存储两个可能值,适合用于存储开关类型的数据。
-
可以用于过滤和条件查询。
-
-
适用场景:
- 用于存储是否开启的标志、是否有效的状态等。
@Field(type = FieldType.Boolean)
private boolean active;
9. FieldType.Date
-
用途:用于存储日期和时间类型数据。
-
特点:
-
支持多种日期格式,可以用于存储日期、时间戳等。
-
支持范围查询和日期排序。
-
-
适用场景:
- 用于存储事件时间、创建时间、更新时间等。
@Field(type = FieldType.Date, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Date createdAt;
10. FieldType.IP
-
用途:用于存储 IP 地址。
-
特点:
-
可以支持范围查询和精确匹配操作。
-
用于存储网络地址,适合做网络数据相关的查询。
-
-
适用场景:
- 用于存储 IP 地址信息,例如访问日志中的 IP 地址。
@Field(type = FieldType.IP)
private String ipAddress;
11. FieldType.Object
-
用途:用于存储嵌套对象类型数据(JSON 对象)。
-
特点:
-
用于存储复杂对象,可以嵌套其他字段。
-
对象字段会被存储为 nested 类型,可以进行复杂查询。
-
-
适用场景:
- 用于存储嵌套对象,如订单项(每个订单中有多个商品)。
@Field(type = FieldType.Object)
private Address address;
12. FieldType.GeoPoint
-
用途:用于存储地理坐标(经纬度)。
-
特点:
-
存储地理位置的数据,可以用于地理位置查询、范围查询(例如:找到指定半径范围内的地点)。
-
支持 geo_distance 查询、geo_bounding_box 查询等。
-
-
适用场景:
- 用于存储商店地址、用户当前位置等地理位置数据。
@Field(type = FieldType.GeoPoint)
private GeoPoint location;
13. FieldType.Nested
-
用途:用于存储嵌套类型字段(nested objects),适用于需要独立查询每个嵌套对象的场景。
-
特点:
-
嵌套字段会被单独索引,并支持嵌套查询。
-
适用于具有多层级、复杂关系的数据结构。
-
-
适用场景:
- 用于存储多层次的嵌套对象,如一篇文章中的评论列表。
@Field(type = FieldType.Nested)
private List<Comment> comments;
14. FieldType.Binary
-
用途:用于存储二进制数据。
-
特点:
-
用于存储文件、图片或其他二进制数据。
-
适用于存储非文本数据。
-
-
适用场景:
- 用于存储图像、文件的二进制数据。
@Field(type = FieldType.Binary)
private byte[] image;
总结
在 Elasticsearch 中,@Field
注解的 type 属性有多种字段类型,适用于不同的数据存储需求。常见的字段类型包括 keyword
、text
、integer
、date
、geo_point
等,每种类型都有不同的用途和特性。选择正确的字段类型可以优化索引性能,并提高查询效率。