当前位置: 首页 > news >正文

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)。例如,中文文本会被按照一定规则分割成词,英文文本会被分割成单词。
  • 适用场景

    • 用于存储文章内容、产品描述、评论等需要全文搜索的文本,适合一般的全文检索场景,特别是英文文本的处理。
  • 示例(使用默认 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_wordik_smart)。

      • 特定领域的文本处理,如专有名词或术语的处理。

      • 忽略大小写、移除停用词、词干提取等。

  • 示例(使用自定义分析器)

    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String description;
    

    自定义行为:使用 ik_max_word 分词器会把中文文本进行更细粒度的分词,例如将 "平板电脑" 分词成 "平板""电脑"。这种方式对中文文本的处理效果会比默认的 standard 分词器更好。

4. FieldType.Integer

  • 用途:用于存储整数类型数据。

  • 特点

    • 存储整数值,适合用于存储诸如年龄、数量等数据。

    • 可以进行范围查询、排序和聚合操作。

    • 支持高效的数值查询。

  • 适用场景

    • 用于存储整型数据,如 ageprice 等。
@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 属性有多种字段类型,适用于不同的数据存储需求。常见的字段类型包括 keywordtextintegerdategeo_point 等,每种类型都有不同的用途和特性。选择正确的字段类型可以优化索引性能,并提高查询效率。

相关文章:

  • 物理:海市蜃楼是宇宙背景辐射吗?
  • [Java][Leetcode middle] 121. 买卖股票的最佳时机
  • 汽车紧固件涂层18问:看敦普无铬锌铝涂料如何为螺丝防锈防腐
  • 遭遇DDoS攻击为什么不能反击回去?
  • MATLAB复制Excel数据到指定区域
  • Egg.js知识框架
  • 塔能智能照明方案:点亮重庆某县节能落地
  • Ollama本地部署
  • 深度学习---常用优化器
  • 在嵌入式调试中IAR提示Fatal error: Failed connecting to probe Session aborted!怎么回事?怎么解决?
  • 【软考-高级】【信息系统项目管理师】论文写作注意事项及2014年至2024年历年论文题目汇总
  • Docker快速入门与应用
  • AD开启交叉选择功能,只选中器件,不选中网络、焊盘
  • TestNG接口自动化
  • h5移动端适配-dvh
  • SVN 中文路径访问报错(权限已正确分配)
  • YAFFS2 文件系统的 `yaffs_dev` 数据结构详解
  • UE RPG游戏开发练手 第二十二课 卸下手上武器
  • 蓝牙AVDTP协议概述
  • WSF12N15 MOS 管在筋膜枪中的高效应用
  • 缺字危机:一本书背后有多少“不存在”的汉字?
  • 上海现有超12.3万名注册护士,本科及以上学历占一半
  • 男子发寻母视频被警方批评教育,律师:发寻亲信息是正当行为
  • 马上评丨75万采购300元设备,仅仅终止采购还不够
  • 这些网红果蔬正在收割你的钱包,营养师:吃了个寂寞
  • 《三餐四季》广东篇今晚开播:食在岭南,遇见百味