能否在 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 布尔值(truefalse)。
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 支持动态映射和显式映射。动态映射适用于快速开发,显式映射适合精确控制字段类型和行为。通过显式映射,可以优化查询性能,避免字段推断错误。映射中常用字段类型包括 textkeyworddate 等,结合分词、多字段、日期格式等特性,可以灵活满足业务需求。

发表评论

后才能评论