【ElasticSearch】text 和 keyword 类型区分

概述

text 类型 keyword 类型
核心机制 分词处理,建立倒排索引 不分词,原样存储
主要用途 全文搜索、模糊匹配 精确匹配、过滤、排序、聚合
分词处理 使用分析器(Analyzer)将文本拆分为词条(Terms) 不进行分词,将整个字符串作为一个词条
排序与聚合 默认不支持,需开启fielddata(消耗内存) 天然支持,使用doc_values(高效)
查询方式 match_query(对查询词分词后匹配) term_query(精确匹配整个字段值)
典型场景 文章正文、商品描述、日志内容等大段文本 姓名、标签、状态码、ID、邮编等结构化数据

搜索过程

仅 text:

处理流程将完全围绕全文搜索进行:

  • 存储(索引)过程:
    • 分词分析:当文档被索引时,字段内容会经过指定的分析器进行处理。这个过程包括分词(将句子拆分成单个词条)、过滤停用词、统一转为小写等。
    • 构建倒排索引:分词后得到的词条(Terms)会被用来构建倒排索引。倒排索引记录了每个词条出现在哪些文档中,以及出现的位置和频率等。
  • 查询过程:
    • 当使用 match等全文搜索查询时,ES 会对查询词进行同样的分词处理,然后在倒排索引中查找匹配的词条,最终根据相关性算法(如 BM25)返回最相关的文档。
    • 想要实现精准查询,无法用 term查询实现,需用 match_phrase等

仅 keyword:

  • 存储(索引)过程:整个字符串被作为一个整体原样存储
  • 查询过程:查询词不分词,直接与索引中的完整值比对
    • 使用 term查询,要求字符、顺序、大小写等完全一致
    • 类似于关系数据库中的 WHERE id = 'xxx'

text和 keyword多字段类型:

  • 定义方法:

    "XXX": {
    "type": "text", // 主字段用于全文搜索
    "fields": {
    "keyword": { // 子字段用于精确匹配
    "type": "keyword",
    "ignore_above": 256 // 可选,超过此长度的值不被索引,尽量减少对性能的影响
    }
    }
    }

  • 存储(索引)过程:

    1. text路径:文本会一样被分词,并构建倒排索引
    2. keyword路径:同时,原始的完整文本会作为一个整体被保留(不进行分词),并通常被加入到 doc_values 中(一种列式存储结构),使得该字段支持精确匹配、排序和聚合操作
  • 查询过程:

    1. 进行全文搜索时,使用字段本身,走 text路径
    2. 当需要进行精确匹配、排序或聚合(统计不同 document 内容出现的次数)就需要使用 log.keyword这个子字段,查询会直接匹配整个字符串
相关推荐
.痞老板.10 小时前
java ee--多线程(进阶)
java·java-ee
可乐ea11 小时前
智能体记忆该拆成几层:笔记、记忆表示与注入上下文
服务器·数据库·笔记·ai智能体·提示词工程·上下文工程·记忆系统
深入云栈12 小时前
Netty 4.2.x 源码深度解析 (二十三):ByteBuf 核心设计 —— 索引、类型与零拷贝
java·后端·架构
阿义有问题12 小时前
MySQL 迁移达梦全流程实战:DTS 七步图解 + 对象名全大写适配(附踩坑清单)
数据库
wang_shu_mo_ran13 小时前
MyBatis 从入门到进阶(一)
java·spring·mybatis
量化分析码农14 小时前
股票历史数据的复权参数对照:多级别返回的字段与数值差异
java·javascript·后端
猫猫不是喵喵.14 小时前
从0到1创建一个微服务项目
java·数据库·微服务·1024程序员节
瑞雪兆丰年兮15 小时前
JavaWeb-day13-SpringBootWeb事务管理&AOP
java·开发语言·springboot·javaweb·事务·web·aop
曲径海盗15 小时前
Try-Except怎么用,3个追问解答在自动化下的应用
java·jvm·oracle
lsc_blog15 小时前
听到优化风声,先准备能由自己掌控的事
数据库·分布式·中间件·职场和发展·重构