Elasticsearch 映射类型
Elasticsearch是一个强大的分布式搜索引擎,广泛用于全文搜索、日志分析和数据可视化等场景。在Elasticsearch中,**映射(Mapping)**是定义索引结构的关键部分。映射决定了文档中的字段如何被存储和索引,以及如何被搜索。理解映射类型是掌握Elasticsearch的基础之一。
什么是映射类型?
在Elasticsearch中,映射类型(Mapping Type)是定义文档结构的方式。它类似于关系型数据库中的表结构,描述了文档中每个字段的数据类型、格式和索引方式。Elasticsearch 7.x 版本之后,映射类型的概念被简化,每个索引只能有一个映射类型(通常为 _doc
),但映射的核心功能仍然存在。
映射类型的主要作用是:
- 定义字段的数据类型(如
text
、keyword
、date
等)。 - 控制字段是否被索引和搜索。
- 设置字段的分析器(Analyzer)和分词器(Tokenizer)。
- 定义字段的存储方式(如是否存储原始值)。
映射类型的基本结构
映射类型由字段(Field)和字段属性(Field Properties)组成。以下是一个简单的映射示例:
{
"mappings": {
"properties": {
"title": {
"type": "text"
},
"description": {
"type": "text"
},
"created_at": {
"type": "date"
},
"views": {
"type": "integer"
}
}
}
}
在这个示例中,我们定义了一个包含四个字段的映射:
title
和description
是文本类型(text
),适合全文搜索。created_at
是日期类型(date
),用于存储时间戳。views
是整数类型(integer
),用于存储数值。
常见的字段类型
Elasticsearch支持多种字段类型,以下是一些常见的类型及其用途:
字段类型 | 描述 |
---|---|
text | 用于全文搜索的文本字段,支持分词和分析。 |
keyword | 用于精确匹配的字符串字段,不支持分词。 |
date | 用于存储日期和时间。 |
integer | 用于存储整数值。 |
float | 用于存储浮点数值。 |
boolean | 用于存储布尔值(true 或 false )。 |
object | 用于存储嵌套的JSON对象。 |
nested | 用于存储数组中的嵌套对象,支持独立的查询。 |
在实际使用中,选择合适的字段类型非常重要。例如,如果你需要对一个字段进行全文搜索,应该使用 text
类型;如果你需要精确匹配(如ID或状态码),则应使用 keyword
类型。
动态映射与显式映射
Elasticsearch支持两种映射方式:动态映射(Dynamic Mapping) 和 显式映射(Explicit Mapping)。
动态映射
动态映射是Elasticsearch的默认行为。当你向索引中添加文档时,Elasticsearch会自动推断字段的类型并创建映射。例如:
PUT /my_index/_doc/1
{
"title": "Elasticsearch Basics",
"views": 100,
"created_at": "2023-10-01T12:00:00Z"
}
Elasticsearch会自动为 title
、views
和 created_at
创建映射。
显式映射
显式映射允许你手动定义字段的类型和属性。这种方式更适合需要精确控制索引结构的场景。例如:
PUT /my_index
{
"mappings": {
"properties": {
"title": {
"type": "text"
},
"views": {
"type": "integer"
},
"created_at": {
"type": "date"
}
}
}
}
动态映射虽然方便,但在生产环境中可能会导致意外的字段类型推断。建议在关键场景中使用显式映射。
实际案例:电商商品索引
假设我们正在为一个电商网站创建商品索引,以下是一个可能的映射定义:
PUT /products
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"category": {
"type": "keyword"
},
"price": {
"type": "float"
},
"in_stock": {
"type": "boolean"
},
"tags": {
"type": "keyword"
},
"description": {
"type": "text"
},
"created_at": {
"type": "date"
}
}
}
}
在这个案例中:
name
和description
使用text
类型,支持全文搜索。category
和tags
使用keyword
类型,适合精确匹配和聚合操作。price
使用float
类型,用于存储商品价格。in_stock
使用boolean
类型,表示库存状态。created_at
使用date
类型,记录商品添加时间。
总结
Elasticsearch的映射类型是定义索引结构的基础。通过合理选择字段类型和映射方式,你可以优化数据的存储和检索性能。在实际应用中,建议根据业务需求选择合适的映射策略,并在生产环境中优先使用显式映射。
如果你想进一步学习Elasticsearch映射的高级特性,可以参考官方文档中的 Mapping 部分。
附加练习
- 创建一个新的索引,定义包含
text
、keyword
、date
和integer
类型的字段。 - 尝试使用动态映射添加文档,观察Elasticsearch如何推断字段类型。
- 修改索引的映射,将一个字段从
text
类型改为keyword
类型,并测试搜索行为的变化。