Elasticsearch核心知识点:keyword与text字段的区别、选型及实战
Elasticsearch核心知识点:keyword与text字段的区别、选型及实战
- 一、前言
- 二、核心定义:keyword与text字段基础认知
- 2.1 text 字段
- 2.2 keyword 字段
- 三、底层原理:数据处理流程(流程图)
- 四、详细区别:10大核心差异对比
- 五、功能限制:text 字段的"不能做"
- 六、实战演示:代码示例
- 6.1 创建索引(定义字段映射)
- 6.2 写入测试数据
- 6.3 text 字段:全文检索(match 查询)
- 6.4 keyword 字段:精确匹配(term 查询)
- 6.5 错误示范:term 查询 text 字段
- 6.6 keyword 字段:聚合/排序
- 七、最佳实践:字段类型选型流程图
- 八、高频使用场景总结
- 8.1 必须用 text 的场景
- 8.2 必须用 keyword 的场景
- 8.3 推荐使用多字段(text + keyword)的场景
- 九、总结
🌺The Begin🌺点点关注,收藏不迷路🌺 |
一、前言
在 Elasticsearch 开发与使用过程中,字段类型选择是决定查询性能、搜索精准度、聚合分析效率的核心环节。其中keyword和text是最常用、最容易混淆的两种字符串类型,很多新手会因为选错类型导致搜索不精准、聚合报错、排序异常、性能拉胯等问题。
本文将从核心定义、底层原理、功能差异、使用场景、实战示例全方位解析两者区别,搭配流程图和对比表,帮你彻底掌握选型逻辑。
二、核心定义:keyword与text字段基础认知
2.1 text 字段
text类型是全文检索专用类型,专门用于存储需要分词、模糊搜索、全文匹配的长文本数据(如文章内容、商品描述、评论、日志详情)。
ES 会对 text 字段执行分词处理,将长文本切分成多个词语,建立倒排索引,支持全文检索。
2.2 keyword 字段
keyword类型是精确匹配专用类型,专门用于存储不需要分词、精确查询、排序、聚合、过滤的短字符串数据(如ID、手机号、邮箱、状态值、标签、枚举值)。
ES 不会对 keyword 字段分词,完整保留原始字符串,以整体形式建立索引。
三、底层原理:数据处理流程(流程图)
两者最核心的区别,就在于ES 写入数据时的处理流程完全不同,直接决定了后续的查询能力。
一句话总结原理:
- text:先分词,再索引→ 适合搜索内容
- keyword:不分词,直接索引→ 适合精确匹配
四、详细区别:10大核心差异对比
我将两者的区别整理为10个核心维度,清晰直观:
| 序号 | 对比维度 | text 字段 | keyword 字段 |
|---|---|---|---|
| 1 | 分词处理 | 自动分词 | 不分词 |
| 2 | 存储形式 | 存储分词后的词语 | 存储完整原始字符串 |
| 3 | 核心用途 | 全文检索、模糊搜索 | 精确查询、过滤、排序、聚合 |
| 4 | 支持查询 | match、match_phrase、multi_match | term、terms、prefix、wildcard |
| 5 | 排序功能 | 不支持/不推荐(会报错/性能差) | 完美支持 |
| 6 | 聚合分析 | 不支持(会报错) | 完美支持 |
| 7 | 适用数据 | 长文本(文章、描述、日志) | 短字符串(ID、状态、标签、手机号) |
| 8 | 索引大小 | 相对更大(分词后词项多) | 相对更小(整体存储) |
| 9 | 查询精准度 | 模糊匹配、相关性打分 | 精确匹配、完全一致 |
| 10 | 典型示例 | “我爱Java” → 分词为:我、爱、Java | “13800138000” → 完整存储 |
五、功能限制:text 字段的"不能做"
这是最容易踩坑的点,必须牢记:
- 不能直接排序:text 分词后无完整值,排序结果混乱且性能极差
- 不能直接聚合:使用 terms 聚合会直接报错,无法统计
- 不适合精确匹配:用 term 查询 text 字段几乎查不到数据
- 不适合短固定值:状态、枚举、ID 用 text 完全是浪费性能
六、实战演示:代码示例
6.1 创建索引(定义字段映射)
我们创建一个article索引,同时使用 text 和 keyword 类型:
PUT/article{"mappings":{"properties":{// 文章标题:需要全文搜索 + 精确匹配 → 多字段类型"title":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},// 文章内容:纯全文搜索 → text"content":{"type":"text"},// 文章状态:固定枚举值 → keyword"status":{"type":"keyword"},// 作者ID:精确查询 → keyword"author_id":{"type":"keyword"}}}}6.2 写入测试数据
PUT/article/_doc/1{"title":"Elasticsearch keyword和text区别详解","content":"本文详细讲解ES中text和keyword的使用场景、底层原理和实战技巧","status":"published","author_id":"1001"}6.3 text 字段:全文检索(match 查询)
# 正确:text 字段用 match 全文搜索GET/article/_search{"query":{"match":{"content":"keyword text 区别"}}}✅ 结果:能查询到数据,分词匹配。
6.4 keyword 字段:精确匹配(term 查询)
# 正确:keyword 字段用 term 精确查询GET/article/_search{"query":{"term":{"status":"published"}}}✅ 结果:精准匹配到数据。
6.5 错误示范:term 查询 text 字段
# 错误:用 term 查询 text 字段,查不到数据GET/article/_search{"query":{"term":{"content":"keyword text 区别"}}}❌ 结果:无数据,因为 text 已经分词,term 是精确匹配。
6.6 keyword 字段:聚合/排序
# 正确:按 keyword 字段聚合统计状态数量GET/article/_search{"size":0,"aggs":{"status_count":{"terms":{"field":"status"}}}}# 正确:按 keyword 字段排序GET/article/_search{"sort":[{"author_id":"asc"}]}七、最佳实践:字段类型选型流程图
实际开发中,按照这个流程选择类型,绝对不会错:
八、高频使用场景总结
8.1 必须用 text 的场景
- 文章内容、商品详情、博客正文
- 用户评论、留言、反馈内容
- 日志详细描述、异常信息
- 任何需要模糊搜索、分词匹配的长文本
8.2 必须用 keyword 的场景
- ID(用户ID、订单ID、商品ID)
- 手机号、邮箱、身份证号、订单编号
- 状态值(published、draft、deleted)
- 标签、分类、枚举值、性别
- 任何需要精确查询、排序、分组统计的字段
8.3 推荐使用多字段(text + keyword)的场景
标题、名称类字段(既需要搜索,又需要排序/聚合):
- 文章标题、商品名称、用户名、店铺名称
九、总结
- text = 分词 + 全文搜索:适合长文本,不支持排序、聚合;
- keyword = 不分词 + 精确匹配:适合短字符串,完美支持排序、聚合、过滤;
- 核心区别:是否分词,这是决定功能和性能的根本;
- 选型口诀:长文本搜素用text,短值精确匹配用keyword,两者都要就用多字段。
只要牢记以上规则,就能彻底避免 ES 字符串字段类型的选型坑!
🌺The End🌺点点关注,收藏不迷路🌺 |
