Elasticsearch核心知识点:keyword与text字段的深度区别与选型指南
- 一、前言
- 二、核心定义
- 三、核心区别总览(流程图)
- 四、详细维度对比(序号化+表格)
- 关键示例演示
- 示例1:分词效果对比
- 示例2:查询效果对比
- 五、核心功能支持差异(重点)
- 1. 聚合查询(Aggregation)
- 2. 排序(Sort)
- 3. 精确匹配 vs 全文检索
- 六、最佳实践:如何选择字段类型?
- 七、企业级实战:多字段映射配置
- 使用方式
- 八、常见踩坑总结
- 九、总结
🌺The Begin🌺点点关注,收藏不迷路🌺 |
一、前言
在 Elasticsearch(ES)的日常使用中,字段类型的选择直接决定了数据的存储效率、查询性能和检索准确性,而keyword和text是最常用、最容易混淆的两种字符串字段类型。
很多新手在建模时随意选择字段类型,导致出现无法精确匹配、分词异常、聚合排序失败等问题。本文将从核心原理、分词机制、适用场景、使用限制等维度,结合流程图和实战案例,彻底讲清两者的区别,帮你精准选型。
二、核心定义
首先明确两个字段类型的官方定义:
- text 字段:用于全文本内容(如文章正文、商品描述、评论内容),ES会对其进行分词处理,将长文本拆分为多个词条后建立倒排索引,支持全文检索。
- keyword 字段:用于精确值内容(如手机号、身份证号、标签、状态码),ES不会对其分词,完整保留原始字符串,直接建立索引,支持精确匹配、聚合、排序、去重操作。
三、核心区别总览(流程图)
为了让你直观理解两者的处理流程,我绘制了ES处理text/keyword字段的核心流程图:
四、详细维度对比(序号化+表格)
我们从分词、索引、查询、功能、存储、适用场景6大核心维度,逐一拆解区别:
| 对比维度 | text 字段 | keyword 字段 |
|---|---|---|
| 1. 分词机制 | 会分词:默认使用标准分词器,将文本拆分为单词/汉字(英文按空格、中文按单字/词语拆分) | 不分词:原始字符串完整存储,不做任何拆分 |
| 2. 索引方式 | 索引分词后的词条,不保留原始完整文本 | 索引原始完整字符串,一对一映射 |
| 3. 支持的查询 | 支持match全文检索(模糊匹配、相关性搜索) | 支持term精确匹配、terms批量匹配 |
| 4. 核心功能支持 | 不支持聚合(aggs)、排序(sort)、去重(cardinality) | 完美支持聚合、排序、去重、过滤 |
| 5. 存储特性 | 占用存储空间相对较大(分词后词条多) | 占用存储空间小(无冗余分词数据) |
| 6. 字段长度限制 | 无严格长度限制,适合长文本 | 建议存储短字符串(超长字符串会降低性能) |
关键示例演示
示例1:分词效果对比
原始数据:我喜欢使用Elasticsearch
- text字段处理结果:
我、喜欢、使用、elasticsearch(分词后多个词条) - keyword字段处理结果:
我喜欢使用Elasticsearch(完整字符串,无拆分)
示例2:查询效果对比
- 用
match查询:text字段能命中,keyword字段无法命中(因为查询词和完整字符串不匹配) - 用
term精确查询:keyword字段能精准命中,text字段无法命中(因为term查询完整值,text只有分词词条)
五、核心功能支持差异(重点)
这是实际开发中最容易踩坑的点,单独重点说明:
1. 聚合查询(Aggregation)
- text字段:直接执行聚合会报错!ES禁止对分词后的text字段做聚合,因为分词后数据无意义,聚合结果完全错误。
- keyword字段:支持
terms聚合、cardinality去重统计,是统计分类、标签数量的首选。
2. 排序(Sort)
- text字段:不支持排序!强行排序会导致结果混乱,ES会抛出异常。
- keyword字段:支持按字符串字典序、自定义规则排序,结果精准。
3. 精确匹配 vs 全文检索
- 你需要搜包含某个关键词的内容(如搜索文章包含“ES”)→ 用text
- 你需要搜完全一致的内容(如搜索手机号=13800138000)→ 用keyword
六、最佳实践:如何选择字段类型?
结合业务场景,给出无脑选型规则,直接套用:
- 场景1:长文本、需要全文搜索→ 选text
案例:博客正文、商品详情、用户评论、新闻内容 - 场景2:短字符串、需要精确匹配/聚合/排序→ 选keyword
案例:手机号、邮箱、订单号、状态值(0/1/2)、标签、用户名、城市名称 - 场景3:既需要全文搜索,又需要聚合排序→同时设置text+keyword(多字段特性)
这是企业级开发最常用的方案!
七、企业级实战:多字段映射配置
在ES中,一个字段可以同时拥有text和keyword两种类型,满足不同业务需求,示例mapping如下:
{"mappings":{"properties":{// 商品名称:既需要全文搜,又需要聚合分类"goods_name":{"type":"text",// 主类型:text,用于全文检索"fields":{"keyword":{"type":"keyword",// 子字段:keyword,用于聚合、排序"ignore_above":256// 超过256字符的字符串不索引,优化性能}}},// 手机号:仅需要精确匹配,直接用keyword"phone":{"type":"keyword"},// 商品描述:仅需要全文搜索,直接用text"goods_desc":{"type":"text"}}}}使用方式
- 全文检索商品名称:
goods_name: "手机" - 对商品名称聚合统计:
goods_name.keyword - 精确查询手机号:
phone: "13800138000"
八、常见踩坑总结
- 坑1:对text字段做聚合/排序 → 报错,解决方案:添加keyword子字段
- 坑2:用term查询text字段 → 查不到数据,解决方案:改用match,或查询keyword子字段
- 坑3:超长字符串用keyword → 索引性能下降,解决方案:设置
ignore_above限制长度 - 坑4:精确值(如状态码)用text → 无法精准过滤,解决方案:直接改用keyword
九、总结
本文通过流程图、维度对比、实战案例,全面讲解了ES中keyword和text字段的核心区别,最后用一句话总结选型核心:
长文本全文搜用text,短值精确匹配/聚合/排序用keyword,两者都需要就用text+keyword多字段!
熟练掌握这两种字段类型的区别,能让你的ES数据建模更规范,查询性能更高效,避免90%的字符串字段相关问题。
🌺The End🌺点点关注,收藏不迷路🌺 |