跳到主要内容

Elasticsearch 映射类型

Elasticsearch是一个强大的分布式搜索引擎,广泛用于全文搜索、日志分析和数据可视化等场景。在Elasticsearch中,**映射(Mapping)**是定义索引结构的关键部分。映射决定了文档中的字段如何被存储和索引,以及如何被搜索。理解映射类型是掌握Elasticsearch的基础之一。

什么是映射类型?

在Elasticsearch中,映射类型(Mapping Type)是定义文档结构的方式。它类似于关系型数据库中的表结构,描述了文档中每个字段的数据类型、格式和索引方式。Elasticsearch 7.x 版本之后,映射类型的概念被简化,每个索引只能有一个映射类型(通常为 _doc),但映射的核心功能仍然存在。

映射类型的主要作用是:

  • 定义字段的数据类型(如 textkeyworddate 等)。
  • 控制字段是否被索引和搜索。
  • 设置字段的分析器(Analyzer)和分词器(Tokenizer)。
  • 定义字段的存储方式(如是否存储原始值)。

映射类型的基本结构

映射类型由字段(Field)和字段属性(Field Properties)组成。以下是一个简单的映射示例:

json
{
"mappings": {
"properties": {
"title": {
"type": "text"
},
"description": {
"type": "text"
},
"created_at": {
"type": "date"
},
"views": {
"type": "integer"
}
}
}
}

在这个示例中,我们定义了一个包含四个字段的映射:

  • titledescription 是文本类型(text),适合全文搜索。
  • created_at 是日期类型(date),用于存储时间戳。
  • views 是整数类型(integer),用于存储数值。

常见的字段类型

Elasticsearch支持多种字段类型,以下是一些常见的类型及其用途:

字段类型描述
text用于全文搜索的文本字段,支持分词和分析。
keyword用于精确匹配的字符串字段,不支持分词。
date用于存储日期和时间。
integer用于存储整数值。
float用于存储浮点数值。
boolean用于存储布尔值(truefalse)。
object用于存储嵌套的JSON对象。
nested用于存储数组中的嵌套对象,支持独立的查询。
提示

在实际使用中,选择合适的字段类型非常重要。例如,如果你需要对一个字段进行全文搜索,应该使用 text 类型;如果你需要精确匹配(如ID或状态码),则应使用 keyword 类型。

动态映射与显式映射

Elasticsearch支持两种映射方式:动态映射(Dynamic Mapping)显式映射(Explicit Mapping)

动态映射

动态映射是Elasticsearch的默认行为。当你向索引中添加文档时,Elasticsearch会自动推断字段的类型并创建映射。例如:

json
PUT /my_index/_doc/1
{
"title": "Elasticsearch Basics",
"views": 100,
"created_at": "2023-10-01T12:00:00Z"
}

Elasticsearch会自动为 titleviewscreated_at 创建映射。

显式映射

显式映射允许你手动定义字段的类型和属性。这种方式更适合需要精确控制索引结构的场景。例如:

json
PUT /my_index
{
"mappings": {
"properties": {
"title": {
"type": "text"
},
"views": {
"type": "integer"
},
"created_at": {
"type": "date"
}
}
}
}
警告

动态映射虽然方便,但在生产环境中可能会导致意外的字段类型推断。建议在关键场景中使用显式映射。

实际案例:电商商品索引

假设我们正在为一个电商网站创建商品索引,以下是一个可能的映射定义:

json
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"
}
}
}
}

在这个案例中:

  • namedescription 使用 text 类型,支持全文搜索。
  • categorytags 使用 keyword 类型,适合精确匹配和聚合操作。
  • price 使用 float 类型,用于存储商品价格。
  • in_stock 使用 boolean 类型,表示库存状态。
  • created_at 使用 date 类型,记录商品添加时间。

总结

Elasticsearch的映射类型是定义索引结构的基础。通过合理选择字段类型和映射方式,你可以优化数据的存储和检索性能。在实际应用中,建议根据业务需求选择合适的映射策略,并在生产环境中优先使用显式映射。

备注

如果你想进一步学习Elasticsearch映射的高级特性,可以参考官方文档中的 Mapping 部分。

附加练习

  1. 创建一个新的索引,定义包含 textkeyworddateinteger 类型的字段。
  2. 尝试使用动态映射添加文档,观察Elasticsearch如何推断字段类型。
  3. 修改索引的映射,将一个字段从 text 类型改为 keyword 类型,并测试搜索行为的变化。