Elasticsearch数据类型大全(新手必看)
与编程语言中变量的数据类型类似,文档中的字段也有与之关联的特定数据类型。Elasticsearch 提供了丰富的数据类型,包括简单类型、复杂类型和专用类型。这个类型的列表还在不断增加,应加以关注。
Elasticsearch 提供了 20 多种不同的数据类型,我们可以根据具体需求选择适当的数据类型。数据类型可以大致分为以下几类:
可以想象,这不是数据类型的完整列表。Elasticsearch 8.6 版本中定义了将近 40 种数据类型。为了优化搜索查询,Elasticsearch 在某些情况下会非常精细地定义类型。例如,文本类型被进一步细分为更具体的类型,如 search_as_you_type、match_only_text、completion、token_count 等。
Elasticsearch 还尝试将数据类型按“家族”进行归类,以优化空间和性能。例如,关键词家族包括 keyword、wildcard 和 constant_keyword 数据类型。这只是当前的“家族”归类,期待未来会有更多。
在 Java 和 C# 等编程语言中,我们无法为一个变量定义两种不同的类型。然而,在 Elasticsearch 中没有这样的限制。当涉及用多种数据类型表示一个字段时,Elasticsearch 非常灵活,允许我们按照自己想要的方式设计模式。
例如,我们可能希望一套教程的作者既是 text 类型又是 keyword 类型。每个字段都有特定的特征,keyword 不会被分析,这意味着字段会按原样存储。我们还可以有更多的类型,例如,除了 text 和 keyword 两种类型,author 字段还可以被声明为 completion 类型。
Elasticsearch 提供了 20 多种不同的数据类型,我们可以根据具体需求选择适当的数据类型。数据类型可以大致分为以下几类:
- 简单类型(simple type):表示字符串(文本信息)、日期、数值和其他基本数据类型变体的常见数据类型。简单类型有 text、boolean、long、date、double 和 binary 等。
- 复杂类型(complex type):通过组合额外的类型创建,类似于编程语言中的对象构造,其中对象可以包含内部对象。复杂类型可以被扁平化或嵌套,以根据需求创建更复杂的数据结构。复杂类型有 object、nested、flattened 和 join 等。
- 专用类型(specialized type):主要用于专门的情况,如地理位置和 IP 地址。专用类型有 geo_shape、geo_point 和 ip,以及 date_range 和 ip_range 等范围类型。
根据具体的业务需求和数据特点,文档中的每个字段可以关联一个或多个数据类型。下表中列出了一些常用的数据类型及示例。注意,Elasticsearch 的官方文档中提供了所有可用的类型。
类型 | 描述 | 示例 |
---|---|---|
text | 表示文本信息(如字符串);非结构化文本 | 电影名、博客文章、书评、日志 |
integer、long、short、byte | 表示一个数值 | 感染病例数、取消的航班数、售出的产品数、图书排名 |
float、double | 表示一个浮点数 | 学生的平均绩点、销售额的移动平均值、评审者的平均评分、温度 |
boolean | 表示一个二元选择:真或假 | 这部电影是一部热门影片吗?这名学生通过考试了吗? |
keyword | 表示结构化文本:不能被拆分或分析的文本 | 错误码、电子邮件地址、电话号码、社会保险号 |
object | 表示一个 JSON 对象 | (JSON 格式的)员工详细信息、推文、电影对象 |
nested | 表示一个对象数组 | 员工地址、电子邮件的路由数据、电影的技术人员 |
可以想象,这不是数据类型的完整列表。Elasticsearch 8.6 版本中定义了将近 40 种数据类型。为了优化搜索查询,Elasticsearch 在某些情况下会非常精细地定义类型。例如,文本类型被进一步细分为更具体的类型,如 search_as_you_type、match_only_text、completion、token_count 等。
Elasticsearch 还尝试将数据类型按“家族”进行归类,以优化空间和性能。例如,关键词家族包括 keyword、wildcard 和 constant_keyword 数据类型。这只是当前的“家族”归类,期待未来会有更多。
在 Java 和 C# 等编程语言中,我们无法为一个变量定义两种不同的类型。然而,在 Elasticsearch 中没有这样的限制。当涉及用多种数据类型表示一个字段时,Elasticsearch 非常灵活,允许我们按照自己想要的方式设计模式。
例如,我们可能希望一套教程的作者既是 text 类型又是 keyword 类型。每个字段都有特定的特征,keyword 不会被分析,这意味着字段会按原样存储。我们还可以有更多的类型,例如,除了 text 和 keyword 两种类型,author 字段还可以被声明为 completion 类型。