温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎样设计elasticsearch映射字段

发布时间:2026-10-07 11:42:42 来源:亿速云 阅读:109 作者:小樊 栏目:软件技术

设计 Elasticsearch 的映射(Mapping)字段,核心目标是:贴合业务查询场景、控制存储成本、避免性能坑。下面我从「设计思路 → 字段类型选择 → 常见场景示例 → 最佳实践」一步一步讲。


一、先明确:Mapping 是干什么的

Mapping 用来定义:

  • 字段名(field name)
  • 字段类型(text / keyword / date / integer …)
  • 如何分词(analyzer)
  • 是否索引(index: false)
  • 是否存储(store)
  • 多字段(multi-fields)

⚠️ Elasticsearch 写入数据后,部分 Mapping 不能修改(如类型变更),所以一开始就设计好很重要。


二、设计 Mapping 的思路(非常重要)

1️⃣ 先想“怎么查”,再想“怎么存”

不要从数据库表结构直接照搬。

问自己:

  • 这个字段要不要搜索?
  • 是模糊搜索还是精确匹配?
  • 要不要排序 / 聚合?
  • 只是展示用吗?

2️⃣ 区分两类核心字段类型

✅ 全文搜索 → text

  • 文章标题
  • 商品描述
  • 日志内容
"title": {
  "type": "text",
  "analyzer": "ik_max_word"
}

✅ 精确匹配 / 聚合 → keyword

  • 状态(status)
  • 用户ID
  • 标签
  • 枚举值
"status": {
  "type": "keyword"
}

3️⃣ 多用 multi-fields(非常推荐)

一个字段同时支持:

  • 分词搜索(text)
  • 精确聚合(keyword)
"name": {
  "type": "text",
  "fields": {
    "keyword": {
      "type": "keyword"
    }
  }
}

查询:

  • name → 模糊搜索
  • name.keyword → 排序 / 聚合

三、常见字段类型怎么选

场景 类型
标题、内容 text
ID、状态码 keyword
时间 date
数量、价格 integer / long / scaled_float
是否 boolean
经纬度 geo_point
对象 object / nested
IP ip

四、一个完整 Mapping 示例(商品索引)

PUT /products
{
  "mappings": {
    "properties": {
      "id": { "type": "keyword" },
      "title": {
        "type": "text",
        "analyzer": "ik_max_word",
        "fields": {
          "keyword": { "type": "keyword" }
        }
      },
      "price": { "type": "scaled_float", "scaling_factor": 100 },
      "status": { "type": "keyword" },
      "tags": { "type": "keyword" },
      "create_time": { "type": "date" },
      "location": { "type": "geo_point" }
    }
  }
}

五、性能 & 成本相关的最佳实践

✅ 1. 不需要搜索的字段,关掉索引

"remark": {
  "type": "text",
  "index": false
}

✅ 2. 不需要返回的字段,别 store

ES 默认 _source 已包含全部字段,一般不用 store: true

✅ 3. 数组不用特殊定义

"tags": ["a", "b"]

直接 keyword 即可

✅ 4. 嵌套对象用 nested

普通 object 会“扁平化”,导致查询错误

"comments": {
  "type": "nested",
  "properties": {
    "user": { "type": "keyword" },
    "content": { "type": "text" }
  }
}

六、动态 Mapping 要小心

默认 ES 会自动推断类型,容易出问题。

✅ 建议:

"dynamic": "strict"

或

"dynamic": "false"

七、给你一个“设计检查清单”

  • [ ] 哪些字段要搜索?
  • [ ] 哪些字段要聚合 / 排序?
  • [ ] 是否需要中文分词?
  • [ ] 是否存在嵌套结构?
  • [ ] 是否有不需要索引的字段?
  • [ ] Mapping 是否锁死 dynamic?

如果你愿意,可以告诉我:

  • 你的具体业务场景
  • 或贴一段数据库表结构

我可以直接帮你设计一份“可用、可扩展”的 Elasticsearch Mapping。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手