elasticsearch字段类型

Elasticsearch 字段类型详解:从基础到高级应用

Elasticsearch 提供了丰富的字段类型,每种类型对应特定的数据结构和使用场景,直接影响索引效率、查询性能和功能支持。以下是 6.8.x 版本中常用字段类型的详细解析,包括适用场景、特性及配置示例。

字符串类型:text 与 keyword

字符串是最常用的字段类型,Elasticsearch 将其细分为 text(全文本)keyword(关键字),以满足不同的检索需求。

text(全文本类型)

  • 特性:

    • 会被分词器处理(拆分为词项),支持全文检索(如 “苹果手机” 可拆分为 “苹果”“手机”,匹配包含任一词项的文档)。
    • 不适合排序、聚合(分词后的值分散,无法高效分组)。
  • 适用场景:需要全文搜索的长文本,如商品描述、文章正文、评论内容等。

  • 配置示例:

    {
      "mappings": {
        "default": {
          "properties": {
            "product_description": { "type": "text" }  // 全文搜索商品描述
          }
        }
      }
    }

keyword(关键字类型)

  • 特性:

    • 不分词,将整个字符串作为一个词项(如 “苹果手机” 会被视为单个词项,仅精确匹配时命中)。
    • 适合过滤(term 查询)、排序(sort)、聚合(terms 分组)。
  • 适用场景:结构化字符串,如标签、状态、ID、分类等。

  • 配置示例:

    {
      "mappings": {
        "default": {
          "properties": {
            "product_tag": { "type": "keyword" },  // 标签用于过滤和聚合
            "order_id": { "type": "keyword" }      // 订单号用于精确查询
          }
        }
      }
    }

进阶:多字段(text + keyword)

对于既需要全文检索又需要排序 / 聚合的字段(如商品名称),可通过 多字段(multi-fields) 同时定义 text 和 keyword 类型:

{
  "mappings": {
    "default": {
      "properties": {
        "product_name": {
          "type": "text",  // 主类型用于全文搜索
          "fields": {
            "keyword": { "type": "keyword", "ignore_above": 256 }  // 子类型用于排序/聚合
          }
        }
      }
    }
  }
}
  • 查询时:用 product_name 进行全文搜索,用 product_name.keyword 进行精确匹配或聚合。

数字类型

Elasticsearch 支持多种数字类型,选择合适的类型可减少存储空间并提高查询效率。

类型 范围 适用场景
long -2^63 ~ 2^63-1 大整数(如订单量、用户数)
integer -2^31 ~ 2^31-1 中等整数(如年龄、数量)
short -32768 ~ 32767 小整数(如评分、状态码)
byte -128 ~ 127 极小整数(如性别:0/1)
double 64 位双精度浮点数 高精度小数(如价格、坐标)
float 32 位单精度浮点数 普通精度小数(如权重)
half_float 16 位半精度浮点数 低精度场景(如概率)
scaled_float 基于长整数的缩放浮点数(需指定 scaling_factor 货币(如 scaling_factor:100 表示保留两位小数)

配置示例

{
  "mappings": {
    "default": {
      "properties": {
        "price": { "type": "scaled_float", "scaling_factor": 100 },  // 价格(如19.99 → 1999)
        "stock": { "type": "integer" },  // 库存数量
        "score": { "type": "float" }     // 商品评分
      }
    }
  }
}

日期类型(date)

日期类型支持多种格式,可自动识别或显式指定,适合时间范围查询、排序等场景。

特性

  • 内部存储为长整数(毫秒级时间戳),查询时自动转换为可读性格式。
  • 支持的格式:"yyyy-MM-dd""yyyy/MM/dd HH:mm:ss""epoch_millis"(时间戳)等。

配置示例

{
  "mappings": {
    "default": {
      "properties": {
        "publish_time": { 
          "type": "date", 
          "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"  // 支持多种格式
        }
      }
    }
  }
}
  • 查询示例:

    { "query": { "range": { "publish_time": { "gte": "2023-01-01", "lte": "now" } } }

布尔类型(boolean)

用于存储 truefalse,适合表示开关、状态等二值属性。

配置示例

{
  "mappings": {
    "default": {
      "properties": {
        "is_active": { "type": "boolean" },  // 是否激活
        "has_stock": { "type": "boolean" }   // 是否有库存
      }
    }
  }
}

范围类型

范围类型用于存储数值或日期的区间,支持范围包含查询(如判断某个值是否在范围内)。

类型 描述
integer_range 整数范围(如 {"gte":18, "lte":30}
float_range 浮点数范围
long_range 长整数范围
double_range 双精度浮点数范围
date_range 日期范围(如 {"gte":"2023-01-01", "lte":"2023-12-31"}
ip_range IP 地址范围(如 {"gte":"192.168.0.0", "lte":"192.168.255.255"}

配置示例

{
  "mappings": {
    "default": {
      "properties": {
        "age_range": { "type": "integer_range" },  // 年龄范围
        "price_range": { "type": "float_range" }   // 价格范围
      }
    }
  }
}
  • 查询示例(匹配年龄在 18-30 范围内的文档):

    { "query": { "term": { "age_range": { "value": 25 } } } }

数组类型(array)

Elasticsearch 不单独定义数组类型,任何字段都可存储数组,只需确保数组元素类型一致。

特性

  • 数组元素必须为同一类型(如字符串数组 ["a", "b"]、整数数组 [1, 2])。
  • 无需显式配置,写入时直接传入数组即可。

示例

// 文档示例(tags为字符串数组,scores为整数数组)
{
  "tags": ["科技", "数码"],
  "scores": [4.5, 4.8, 4.7]
}
  • 查询数组中包含 “科技” 的文档:

    { "query": { "term": { "tags": "科技" } } }

对象类型(object 与 nested)

用于存储 JSON 对象或对象数组,两者的区别在于是否支持独立查询对象内部字段。

object(对象类型)

  • 特性:用于存储单个 JSON 对象,内部字段会被扁平化为顶级字段(如 user.name)。
  • 局限:对象数组中的字段会被 “扁平化合并”,无法区分不同对象的属性(如无法查询 “name 为 A 且 age 为 20” 的对象)。

配置示例

{
  "mappings": {
    "default": {
      "properties": {
        "user": { 
          "type": "object",  // 单个用户对象
          "properties": {
            "name": { "type": "text" },
            "age": { "type": "integer" }
          }
        }
      }
    }
  }
}

nested(嵌套类型)

  • 特性:用于存储对象数组,每个对象会被视为独立文档索引,支持对对象内部字段进行关联查询。
  • 适用场景:需要查询对象数组中满足 “多字段组合条件” 的场景(如 “作者为张三且评分 > 4.5 的书籍”)。

配置示例

{
  "mappings": {
    "default": {
      "properties": {
        "books": { 
          "type": "nested",  // 书籍对象数组
          "properties": {
            "title": { "type": "text" },
            "author": { "type": "keyword" },
            "score": { "type": "float" }
          }
        }
      }
    }
  }
}
  • 查询示例(查询 books 数组中作者为 “张三” 且评分 > 4.5 的文档):

    {
      "query": {
        "nested": {
          "path": "books",  // 指定嵌套对象路径
          "query": {
            "bool": {
              "must": [
                { "term": { "books.author": "张三" } },
                { "range": { "books.score": { "gt": 4.5 } } }
              ]
            }
          }
        }
      }
    }

地理类型

用于存储地理位置信息,支持距离查询、区域过滤等地理相关操作。

geo_point(地理点类型)

  • 特性:存储经纬度坐标(如 {"lat": 39.9, "lon": 116.3}),支持距离排序、范围查询。

配置示例

{
  "mappings": {
    "default": {
      "properties": {
        "location": { "type": "geo_point" }  // 经纬度坐标
      }
    }
  }
}
  • 查询示例(查找距离北京天安门(39.9042, 116.4074)10 公里内的地点):

    {
      "query": {
        "geo_distance": {
          "distance": "10km",
          "location": { "lat": 39.9042, "lon": 116.4074 }
        }
      }
    }

geo_shape(地理形状类型)

  • 特性:存储复杂地理形状(如多边形、圆形),支持判断点是否在形状内、形状是否相交等操作。

其他常用类型

类型 描述 适用场景
ip 存储 IPv4 或 IPv6 地址,支持范围查询 日志中的 IP 地址、设备 IP
completion 提供自动补全建议,支持前缀匹配 搜索框自动提示
token_count 统计字符串分词后的词项数量 统计文章关键词数量
join 同一索引内创建父子文档关系 评论与文章、订单与商品的关联