ES---ES支持哪些数据类型,和MySQL之间的映射

首页 编程分享 PHP丨JAVA丨OTHER 正文

后端程序员Aska 转载 编程分享 2025-04-19 22:00:56

简介 Elasticsearch支持以下数据类型 1.Text: 用于存储全文文本数据,如文章或书籍内容。支持全文搜索和分析。 2.Keyword: 用于存储文本值,通常用于索引结构化内容,如邮件地址、标签


Elasticsearch支持以下数据类型

  • 1.Text: 用于存储全文文本数据,如文章或书籍内容。支持全文搜索和分析。
  • 2.Keyword: 用于存储文本值,通常用于索引结构化内容,如邮件地址、标签或任何需要精确匹配的内容。
  • 3.Date: 存储日期或日期和时间。
  • 4.Long, Integer, Short, Byte, Double, Float: 这些是数值类型,用于存储各种形式的数字。
  • 5.Boolean: 存储 true 或 false 值。
  • 6.Binary: 用于存储二进制数据。
  • 7.Object: 用于嵌套文档,即文档内部可以包含文档。
  • 8.Nested: 类似于 Object 类型,但用于存储数组列表,其中列表中的每个元素都是完全独立且可搜索的。

我们经常会把MySQL 中的数据同步到 ES 中,他们之间的类型的映射关系如下:

mysql ES 映射关系如下

MySQL 类型 Elasticsearch 类型 说明
VARCHAR text, keyword 根据是否需要全文搜索或精确搜索选择使用 text 或 keyword。
CHAR keyword 通常映射为 keyword,因为它们用于存储较短的、不经常变化的字符序列。
BLOB/TEXT text 大文本块使用 text 类型,支持全文检索。
INT, BIGINT long 大多数整数类型映射为 long,以支持更大的数值。
TINYINT byte 较小的整数可以映射为 byte 类型。
DECIMAL, FLOAT, DOUBLE double, float 根据精确度需求选择 double 或 float。
DATE, DATETIME, TIMESTAMP date 所有的日期时间类型均可映射为 date。
TINYINT(1) boolean

text 和 keyword 有啥区别

text 类型被设计用于全文搜索。这意味着当文本被存储为 text 类型时,Elasticsearch 会对其进行分词,把文本分解成单独的词或短语,便于搜索引擎进行全文搜索。因为 text 字段经过分词,它不适合用于排序或聚合查询

  • text适用于存储需要进行全文搜索的内容,比如新闻文章、产品描述等

keyword 类型用于精确值匹配,不进行分词处理。这意味着存储在 keyword 字段的文本会被当作一个完整不可分割的单元进行处理。因为 keyword 类型字段是作为整体存储,它们非常适合用于聚合(如计数、求和、过滤唯一值等)和排序操作。由于不进行分词,keyword 类型字段不支持全文搜索,但可以进行精确匹配查询

  • keyword适用于需要进行精确搜索的场景,比如标签、ID 编号、邮箱地址等

ES 不支持 decimal,如何避免丢失精度

通过上文我们知道,ES 不支持 decimal 类型的,只有 double、float 等类型,那么,MySQL 中的 decimal 类型,同步到 ES 之后,如何避免丢失精度呢?

price DECIMAL(10, 2)

如以上 price 字段,在 es 中如何表示呢?有以下几种方式:

使用字符串类型(推荐)

将 decimal 数据作为字符串类型存储在 Elasticsearch 中。这种方式可以保证数字的精度不会丢失,因为字符串会保留数字的原始表示形式。

  • ●优点:完全保留数字的精度。简单易于实现,数据迁移时不需特别处理。
  • ●缺点:作为字符串存储的数字不能直接用于数值比较或数学运算,需要在应用层处理转换。
{
    "properties": {
        "price": {
            "type": "keyword"
        }
    }
}

扩大浮点类型的精度(推荐)

虽然 double 类型在理论上可能会有精度损失,但实际上 double 类型提供的精度对于许多业务需求已经足够使用。如果决定使用这种方法,可以在数据迁移或同步时适当扩大数值范围以尽量减小精度损失。

  • ●优点:可以直接进行数值比较和数学运算。
  • ●缺点:在非常高精度的需求下可能存在精度损失。
{
    "properties": {
        "amount": {
            "type": "double"
        }
    }
}

使用scaled_float(推荐)

Elasticsearch 的 scaled_float 类型是一种数值数据类型,专门用于存储浮点数。其特点是通过一个缩放因子(scaling factor)将浮点数转换为整数来存储,从而在一定范围内提高存储和计算的效率。

他使用一个缩放因子将浮点数转换为整数存储。例如,如果缩放因子是 100,那么值 123.45 会存储为 12345。这样可以避免浮点数存储和计算中的精度问题。

{
    "mappings": {
        "properties": {
            "price": {
                "type": "scaled_float",
                "scaling_factor": 100
            }
        }
    }
}

使用多个字段

在某些情况下,可以将 decimal 数值拆分为两个字段存储:一个为整数部分,另一个为小数部分。这样做可以在不丢失精度的情况下,将数值分开处理。

  • ●优点:保持数值精确,同时可进行部分数学运算。
  • ●缺点:增加了数据处理的复杂性,需要在应用层重建数值。
{
    "properties": {
        "total_price_yuan": {
            "type": "integer"
        },
        "total_price_cents": {
            "type": "integer"
        }
    }
}

使用自定义脚本

在查询时,可以使用 Elasticsearch 的脚本功能(如 Painless 脚本)来处理数值计算,确保在处理过程中控制精度。

  • ●优点:灵活控制数据处理逻辑。
  • ●缺点:可能影响查询性能,增加系统复杂性。

转载链接:https://juejin.cn/post/7493733975074586634


Tags:


本篇评论 —— 揽流光,涤眉霜,清露烈酒一口话苍茫。


    声明:参照站内规则,不文明言论将会删除,谢谢合作。


      最新评论




ABOUT ME

Blogger:袅袅牧童 | Arkin

Ido:PHP攻城狮

WeChat:nnmutong

Email:nnmutong@icloud.com

标签云