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 类型写入字符串数据字段类型判断执行分词器处理拆分文本为独立词语去除停用词/大小写转换等为每个词语建立倒排索引支持全文检索不执行分词完整保留原始字符串以完整字符串建立索引支持精确匹配/排序/聚合一句话总结原理text先分词再索引→ 适合搜索内容keyword不分词直接索引→ 适合精确匹配四、详细区别10大核心差异对比我将两者的区别整理为10个核心维度清晰直观序号对比维度text 字段keyword 字段1分词处理自动分词不分词2存储形式存储分词后的词语存储完整原始字符串3核心用途全文检索、模糊搜索精确查询、过滤、排序、聚合4支持查询match、match_phrase、multi_matchterm、terms、prefix、wildcard5排序功能不支持/不推荐会报错/性能差完美支持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}}},// 文章内容纯全文搜索 → textcontent:{type:text},// 文章状态固定枚举值 → keywordstatus:{type:keyword},// 作者ID精确查询 → keywordauthor_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}]}七、最佳实践字段类型选型流程图实际开发中按照这个流程选择类型绝对不会错长文本、需要全文搜索短字符串、需要精确匹配既需要搜索又需要排序/聚合需要存储字符串数据长度/用途选择 text 类型选择 keyword 类型text keyword 多字段类型支持 match 搜索不支持排序/聚合支持 term 精确查询支持排序、聚合、过滤主字段 text用于搜索子字段 keyword用于排序/聚合八、高频使用场景总结8.1 必须用 text 的场景文章内容、商品详情、博客正文用户评论、留言、反馈内容日志详细描述、异常信息任何需要模糊搜索、分词匹配的长文本8.2 必须用 keyword 的场景ID用户ID、订单ID、商品ID手机号、邮箱、身份证号、订单编号状态值published、draft、deleted标签、分类、枚举值、性别任何需要精确查询、排序、分组统计的字段8.3 推荐使用多字段text keyword的场景标题、名称类字段既需要搜索又需要排序/聚合文章标题、商品名称、用户名、店铺名称九、总结text 分词 全文搜索适合长文本不支持排序、聚合keyword 不分词 精确匹配适合短字符串完美支持排序、聚合、过滤核心区别是否分词这是决定功能和性能的根本选型口诀长文本搜素用text短值精确匹配用keyword两者都要就用多字段。只要牢记以上规则就能彻底避免 ES 字符串字段类型的选型坑The End点点关注收藏不迷路