Bootstrap

ES中的字段类型

前言

1、字段类型

在 Elasticsearch (ES) 中,字段类型定义了数据的格式和如何索引与存储字段的内容。每个字段都有一个类型,这决定了它如何在索引中存储、搜索和聚合。

这些数据类型可以组合使用,并根据实际的业务需求来选择最合适的数据类型。在创建索引时,映射(Mapping)用于定义每个字段的类型和其他属性(如是否分词、是否可索引、是否存储等)。

2、如何查看字段类型
GET /your_index_name/_mapping
{
  "your_index_name": {
    "mappings": {
      "properties": {
        "title": {
          "type": "text"
        },
        "description": {
          "type": "text"
        },
        "price": {
          "type": "float"
        },
        "created_at": {
          "type": "date"
        },
        "is_active": {
          "type": "boolean"
        }
      }
    }
  }
}

以下是 Elasticsearch 中常见的字段类型及其用途。

一、文本类型 (Text)

用于存储和分析全文本数据,适用于字符串、长文本等需要分词的字段。

1、text

用于存储大量的、需要分词的文本数据。Elasticsearch 会对 text 字段的内容进行分析和分词,这样可以支持全文搜索。Elasticsearch 默认会对 text 类型字段使用一个标准分析器(standard analyzer),将其分词成多个单词,以便进行高效的全文搜索。

注意:如果字段的类型是 text,ES 会自动为其创建一个名为 <字段名>.keyword 的子字段,用于精确匹配查询。

适用场景:文章内容、描述、评论等。示例:"description": { "type": "text" }

2、keyword

用于存储不需要分词的字符串数据,通常用于存储标识符、标签、状态、类别等数据。这些字段会被精确匹配,适合用在排序、聚合和过滤中。

适用场景:ID、电子邮件、用户名、状态码等。示例:"status": { "type": "keyword" }

二、数值类型

数值类型用于存储各种数字,包括整数、浮动小数等。

  • long:用于存储长整型数字,范围从 -2^63 到 2^63-1。

    • 示例:"age": { "type": "long" }
  • integer:用于存储整数,范围从 -2^31 到 2^31-1。

    • 示例:"year": { "type": "integer" }
  • short:用于存储较小的整数,范围从 -2^15 到 2^15-1。

    • 示例:"count": { "type": "short" }
  • byte:用于存储很小的整数,范围从 -128 到 127。

    • 示例:"byte_value": { "type": "byte" }
  • double:用于存储浮动小数,精度较高,范围从 -1.7e308 到 1.7e308。

    • 示例:"price": { "type": "double" }
  • float:用于存储浮动小数,精度较低,范围从 -3.4e38 到 3.4e38。

    • 示例:"rating": { "type": "float" }
  • half_float:用于存储精度较低的浮动小数,范围从 -6.5e4 到 6.5e4。

    • 示例:"temperature": { "type": "half_float" }
  • scaled_float:用于存储带小数的浮动数字,通过一个因子来缩放存储的数据。

    • 示例:"price": { "type": "scaled_float", "scaling_factor": 100 }
  • double_rangefloat_rangelong_rangeinteger_range:用于存储数值范围类型的数据,通常用于做范围查询。

    • 示例:"temperature_range": { "type": "double_range" }

三、日期类型date

日期类型用于存储时间戳或日期。默认的日期格式是 yyyy-MM-dd'T'HH:mm:ss.SSSZ,但可以根据需要进行配置。

示例:"timestamp": { "type": "date" }

四、布尔类型boolean

用于存储 truefalse 的值。

示例:"is_active": { "type": "boolean" }

五、二进制类型 (Binary)

用于存储二进制数据(例如图片、音频、视频等)。

示例:"file_data": { "type": "binary" }

六、IP 类型 (IP)

用于存储 IPv4 和 IPv6 地址。

示例:"ip_address": { "type": "ip" }

七、地理位置类型 (Geo)

用于存储地理位置信息。

1、geo_point

用于存储地理坐标(经度、纬度),支持地理位置查询。

示例:"location": { "type": "geo_point" }

2、geo_shape

用于存储复杂的地理形状(如多边形、圆形等),支持对地理区域的查询。

示例:"shape": { "type": "geo_shape" }

八、对象和嵌套类型

1、object

用于存储 JSON 对象。该类型表示字段中包含嵌套的键值对,可以嵌套多层结构。

示例:"address": { "type": "object" }

2、nested

object 类型类似,但它用于存储嵌套对象,并允许对嵌套对象内的字段进行查询和聚合。它会在查询时将嵌套的文档视为独立的文档。

"comments": {
  "type": "nested"
}

九、范围类型(Range Types)

  • integer_range: 存储整数范围。
  • float_range: 存储浮动小数范围。
  • date_range: 存储日期范围。
  • long_range: 存储长整数范围。

十、合并数据类型(Join)

用于实现父子关系数据建模,常用于表示父文档和子文档之间的关系。

"relationship": {
  "type": "join"
}

十一、文本多字段(Multi-fields)

在同一字段上定义多个字段类型,便于对数据进行不同方式的处理。例如,可以同时将字段作为 text 类型和 keyword 类型进行存储,以支持全文搜索和精确匹配。

"title": {
  "type": "text",
  "fields": {
    "raw": {
      "type": "keyword"
    }
  }
}

十二、标识符类型(Completion)

用于实现高效的建议功能,通常用于自动补全(如搜索框自动提示)。

"suggest": {
  "type": "completion"
}

;