Elasticsearch权威指南:Mapping映射机制深度解析

Elasticsearch权威指南:Mapping映射机制深度解析

elasticsearch-definitive-guide The Definitive Guide to Elasticsearch elasticsearch-definitive-guide 项目地址: https://gitcode.com/gh_mirrors/el/elasticsearch-definitive-guide

什么是Mapping映射

在Elasticsearch中,mapping(映射)是定义索引中字段如何存储和索引的核心机制。它相当于关系型数据库中的表结构定义,但功能更为强大。映射决定了:

  1. 字段的数据类型(如字符串、数字、日期等)
  2. 字段的索引方式(是否分析、如何分析)
  3. 字段的元数据属性

当文档被索引时,Elasticsearch会根据mapping定义来处理每个字段的值,确保数据以正确的方式被存储和检索。

核心字段类型

Elasticsearch支持以下基本字段类型:

| JSON类型 | Elasticsearch字段类型 | 说明 | |---------|----------------------|------| | 布尔值(true/false) | boolean | 布尔类型 | | 整数(123) | long | 长整型 | | 浮点数(123.45) | double | 双精度浮点 | | 有效日期字符串("2014-09-15") | date | 日期类型 | | 普通字符串("foo bar") | string | 字符串类型 |

重要提示:数字如果加了引号(如"123")会被识别为字符串类型而非数字类型。但如果字段已定义为long类型,Elasticsearch会尝试将字符串转换为long,转换失败会抛出异常。

动态映射机制

当索引包含新字段的文档时,Elasticsearch会使用动态映射(dynamic mapping)来自动推断字段类型。这种机制非常智能,能根据JSON数据的基本类型自动确定最合适的字段类型。

查看现有映射

可以通过_mappingAPI查看索引中类型的映射定义:

GET /gb/_mapping/tweet

返回结果示例:

{
   "gb": {
      "mappings": {
         "tweet": {
            "properties": {
               "date": {
                  "type": "date",
                  "format": "strict_date_optional_time||epoch_millis"
               },
               "name": {
                  "type": "string"
               },
               "tweet": {
                  "type": "string"
               },
               "user_id": {
                  "type": "long"
               }
            }
         }
      }
   }
}

专业建议:不要假设映射是正确的,特别是在遇到查询结果不符合预期时,首先检查映射定义是否正确。

自定义字段映射

虽然基本字段类型能满足大多数需求,但实际应用中经常需要自定义字段映射,特别是字符串字段。自定义映射可以实现:

  • 区分全文检索字段和精确值字段
  • 使用特定语言分析器
  • 优化字段的部分匹配
  • 自定义日期格式
  • 以及其他高级配置

字符串字段的特殊配置

字符串字段有两个最重要的映射属性:

  1. index:控制字符串如何被索引

    • analyzed(默认):先分析再索引,适合全文检索
    • not_analyzed:原样索引,不做分析,适合精确匹配
    • no:不索引该字段,不可搜索
  2. analyzer:指定用于分析和搜索的分析器

    • 内置分析器:standard(默认)、whitespace、simple、english等
    • 也可以使用自定义分析器

示例配置:

{
    "tweet": {
        "type": "string",
        "analyzer": "english"
    }
}

更新映射

可以在创建索引时指定映射,也可以通过_mapping端点后期添加或更新映射。

重要限制

  • 可以添加新字段,但不能修改现有字段的映射
  • 已索引的数据不会因为映射更新而改变

更新映射示例:

PUT /gb/_mapping/tweet
{
  "properties": {
    "tag": {
      "type": "string",
      "index": "not_analyzed"
    }
  }
}

测试映射效果

使用analyzeAPI可以测试字符串字段的映射效果:

GET /gb/_analyze
{
  "field": "tweet",
  "text": "Black-cats"
}

对比不同字段的分析结果,可以验证映射是否按预期工作。例如,使用english分析器的字段会将"Black-cats"分析为["black", "cat"],而not_analyzed字段则会保持原样。

最佳实践建议

  1. 在索引设计阶段就规划好映射,避免后期修改
  2. 对于确定不需要全文检索的字段,设置为not_analyzed
  3. 根据业务需求选择合适的分词器
  4. 定期检查映射,确保其符合预期
  5. 使用analyze API验证分词效果

理解并正确使用Elasticsearch的映射机制,是构建高效搜索系统的关键基础。通过合理的映射配置,可以显著提升搜索质量和性能。

elasticsearch-definitive-guide The Definitive Guide to Elasticsearch elasticsearch-definitive-guide 项目地址: https://gitcode.com/gh_mirrors/el/elasticsearch-definitive-guide

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆汝萱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值