能否在 Elasticsearch 中定义映射?
参考回答
是的,Elasticsearch 中可以通过 映射(Mapping) 来定义索引中字段的结构和数据类型。映射类似于关系型数据库中的表结构(Schema),用于定义文档的字段类型、字段的行为以及索引方式。
定义映射的主要方式:
1. 动态映射(默认):Elasticsearch 根据文档内容自动推断字段类型。
2. 显式映射:用户手动定义字段类型和行为。
显式映射示例:
PUT /products
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"price": {
"type": "float"
},
"in_stock": {
"type": "boolean"
},
"created_at": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
}
}
}
}
详细讲解与拓展
1. 映射的作用
- 控制字段类型:防止 Elasticsearch 自动推断错误。例如,将价格设置为
float,而不是默认的long。 - 优化查询性能:通过定义字段的索引方式,减少存储和查询开销。
- 定制字段行为:定义字段是否需要分词、是否存储等。
2. 动态映射
动态映射是 Elasticsearch 的默认行为。当索引接收到一个没有定义映射的字段时,会自动推断字段类型。例如:
插入以下文档:
POST /products/_doc/1
{
"name": "Laptop",
"price": 1000,
"in_stock": true
}
动态映射会自动创建以下映射:
{
"properties": {
"name": {
"type": "text"
},
"price": {
"type": "long"
},
"in_stock": {
"type": "boolean"
}
}
}
动态映射虽然方便,但可能存在以下问题:
– 类型推断错误。例如,price 被识别为 long 而非 float。
– 查询性能可能受影响,尤其是在需要精确控制字段行为时。
3. 显式映射的使用
创建索引时定义映射
在创建索引时可以指定映射:
PUT /products
{
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "standard"
},
"price": {
"type": "float"
}
}
}
}
为已有索引添加新字段
可以为已有索引添加新字段,但无法修改已有字段的类型:
PUT /products/_mapping
{
"properties": {
"description": {
"type": "text"
}
}
}
4. 映射中的常见字段类型
| 字段类型 | 描述 |
|---|---|
text |
用于全文搜索的字符串字段,支持分词。 |
keyword |
用于精确匹配的字符串字段,不支持分词(如标签、状态等)。 |
integer |
整数类型。 |
float |
浮点数类型。 |
boolean |
布尔值(true 或 false)。 |
date |
日期类型,支持多种格式化方式(如 yyyy-MM-dd)。 |
object |
JSON 对象,嵌套结构。 |
nested |
嵌套类型,适用于嵌套对象查询。 |
5. 分词与映射
- text 字段:默认支持分词,用于全文搜索。例如:
{ "name": { "type": "text", "analyzer": "standard" } }文档内容
"Elasticsearch is powerful"会被分词为:[elasticsearch, is, powerful]。 -
keyword 字段:适用于不需要分词的精确匹配,如标签或状态。例如:
{ "status": { "type": "keyword" } }
6. 自定义映射的高级用法
指定日期格式
{
"created_at": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss"
}
}
多字段(Multi-field)
允许一个字段既支持全文搜索又支持精确匹配:
{
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
name字段用于全文搜索。name.keyword字段用于精确匹配。
禁用字段的索引
可以将字段设置为仅存储而不索引,减少索引开销:
{
"description": {
"type": "text",
"index": false
}
}
总结
Elasticsearch 支持动态映射和显式映射。动态映射适用于快速开发,显式映射适合精确控制字段类型和行为。通过显式映射,可以优化查询性能,避免字段推断错误。映射中常用字段类型包括 text、keyword、date 等,结合分词、多字段、日期格式等特性,可以灵活满足业务需求。