Elasticsearch核心字段:keyword与text深度对比(区别+场景+选型+实战)
- 一、前言
- 二、Elasticsearch text 和 keyword 字段:基础定义
- 2.1 text 字段定义
- 2.2 keyword 字段定义
- 三、text 和 keyword 处理流程:核心流程图
- 3.1 text 字段处理流程(分词流程)
- 3.2 keyword 字段处理流程(不分词流程)
- 3.3 流程核心区别
- 四、text 和 keyword 核心区别(超详细对比)
- 4.1 五大核心区别(必掌握)
- 4.2 表格对比(一目了然)
- 五、text 和 keyword 实战示例(最直观理解)
- 5.1 示例数据
- 5.2 text 字段处理结果
- 5.3 keyword 字段处理结果
- 六、Elasticsearch 多字段特性:fields 最佳实践
- 6.1 问题场景
- 6.2 最优 Mapping 配置
- 6.3 使用方式
- 七、text 和 keyword 常见踩坑总结
- 7.1 坑1:用 text 做聚合(报错/无结果)
- 7.2 坑2:用 keyword 做全文搜索(查不到数据)
- 7.3 坑3:不设置 fields,导致字段无法同时搜索和聚合
- 八、字段类型选型指南(生产直接用)
- 8.1 必须用 keyword 的场景
- 8.2 必须用 text 的场景
- 九、总结:text vs keyword 核心口诀
- 十、文末总结
- 总结
🌺The Begin🌺点点关注,收藏不迷路🌺 |
一、前言
在Elasticsearch映射(Mapping)设计中,text和keyword是最常用、最容易混淆的两个字符串类型。
90%的ES新手都会踩坑:用错字段类型导致无法精确查询、无法聚合排序、分词混乱、查询缓慢等问题。
本文将从定义、分词原理、处理流程、核心区别、使用场景、实战示例全方位讲解,帮你彻底掌握text和keyword的选型,写出最优Mapping。
二、Elasticsearch text 和 keyword 字段:基础定义
2.1 text 字段定义
text:用于长文本内容,会被分词器拆分成词语,建立倒排索引,适合全文检索。
适用:文章内容、描述、评论、标题等需要搜索的长文本。
2.2 keyword 字段定义
keyword:用于短字符串,不会分词,原样存储和索引,适合精确匹配、聚合、排序、过滤。
适用:状态值、枚举值、标签、手机号、邮箱、IP、ID、城市名称等。
三、text 和 keyword 处理流程:核心流程图
3.1 text 字段处理流程(分词流程)
3.2 keyword 字段处理流程(不分词流程)
3.3 流程核心区别
- text:一定会分词,拆分成词语,不支持完整字符串操作
- keyword:完全不分词,字符串整体处理,支持精确操作
四、text 和 keyword 核心区别(超详细对比)
4.1 五大核心区别(必掌握)
是否分词
- text:分词
- keyword:不分词
支持的查询方式
- text:支持match全文检索
- keyword:支持term精确匹配
支持的操作
- text:不支持聚合、排序、去重
- keyword:支持聚合、排序、去重、过滤
存储格式
- text:存储分词后的词语
- keyword:存储完整原始字符串
适用长度
- text:长文本
- keyword:短字符串
4.2 表格对比(一目了然)
| 对比维度 | text 字段 | keyword 字段 |
|---|---|---|
| 是否分词 | 是,会拆分词语 | 否,完整字符串 |
| 主要用途 | 全文搜索、模糊匹配 | 精确查询、聚合、排序 |
| 支持查询 | match、match_phrase | term、terms、prefix |
| 聚合/排序 | 不支持(或性能极差) | 完美支持 |
| 存储内容 | 分词后的词语 | 原始完整内容 |
| 典型场景 | 文章内容、描述、评论 | 状态、ID、标签、城市、手机号 |
| 默认高亮 | 支持 | 不常用 |
五、text 和 keyword 实战示例(最直观理解)
5.1 示例数据
原始字符串:我是中国程序员,热爱Elasticsearch技术
5.2 text 字段处理结果
分词后:我 / 是 / 中国 / 程序员 / 热爱 / Elasticsearch / 技术
查询程序员→可以命中
查询中国程序员→可以命中
查询完整字符串 →可以命中
5.3 keyword 字段处理结果
存储结果:我是中国程序员,热爱Elasticsearch技术(原样)
查询程序员→无法命中
查询中国程序员→无法命中
查询完整字符串 →可以命中
六、Elasticsearch 多字段特性:fields 最佳实践
6.1 问题场景
一个字段既需要全文搜索,又需要聚合排序怎么办?
答案:text + keyword 共存
6.2 最优 Mapping 配置
PUT /my_index { "mappings": { "properties": { "title": { // 文章标题 "type": "text", // 全文检索 "fields": { "keyword": { // 子字段keyword "type": "keyword", "ignore_above": 256 // 超长字符串不索引 } } } } } }6.3 使用方式
- 全文搜索:使用
title - 聚合/排序:使用
title.keyword
七、text 和 keyword 常见踩坑总结
7.1 坑1:用 text 做聚合(报错/无结果)
错误示例: "aggs": { "group_by_city": { "terms": { "field": "city_text" } // text字段无法聚合 } }7.2 坑2:用 keyword 做全文搜索(查不到数据)
错误示例: { "term": { "content_keyword": "程序员" } } // 无法匹配长文本7.3 坑3:不设置 fields,导致字段无法同时搜索和聚合
解决方案:统一使用text + keyword结构
八、字段类型选型指南(生产直接用)
8.1 必须用 keyword 的场景
- 状态值:status(0/1/2)
- 枚举值:性别、类型、标签
- 标识字段:userId、orderId、手机号、邮箱
- 地址信息:国家、省份、城市
- 需要分组、排序、去重的字段
8.2 必须用 text 的场景
- 文章正文、内容描述
- 商品介绍、评论详情
- 日志长文本
- 需要全文搜索、模糊匹配的字段
九、总结:text vs keyword 核心口诀
- 长文本、要搜索 → text
- 短字符串、要精确/聚合/排序 → keyword
- 既要搜索又要聚合 → text + keyword 共存
- 分词与否是本质区别
十、文末总结
text 和 keyword 是 Elasticsearch 最基础、最重要的字符串类型。
- text = 分词 = 全文搜索
- keyword = 不分词 = 精确匹配+聚合+排序
合理选择字段类型,是Mapping设计的第一步,也是保证查询性能、功能正常的关键。
总结
- 本质区别:text分词用于全文检索;keyword不分词用于精确匹配
- 核心能力:text支持搜索,keyword支持聚合、排序、去重
- 最佳实践:通用字段使用
text + fields.keyword双类型 - 选型口诀:长文本用text,短字符串用keyword
- 避坑指南:text绝不用于聚合,keyword绝不用于全文搜索
🌺The End🌺点点关注,收藏不迷路🌺 |