【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这个子字段,查询会直接匹配整个字符串
相关推荐
zhanghongbin017 小时前
AI 采集器:Claude Code、OpenAI、LiteLLM 监控
java·前端·人工智能
计算机毕设vx_bysj68697 小时前
【免费领源码】77196基于java的手机银行app管理系统的设计与实现 计算机毕业设计项目推荐上万套实战教程JAVA,node.js,C++、python、大屏数据可视化
java·mysql·智能手机·课程设计
忘梓.7 小时前
墨色规则与血色节点:C++红黑树设计与实现探秘
java·开发语言·c++
hhh3u3u3u7 小时前
Visual C++ 6.0中文版安装包下载教程及win11安装教程
java·c语言·开发语言·c++·python·c#·vc-1
星河耀银海7 小时前
C++ 模板进阶:特化、萃取与可变参数模板
java·开发语言·c++
ShawnLiaoking7 小时前
pycharm 上传更新代码
ide·elasticsearch·pycharm
xixingzhe27 小时前
Mysql统计空间增量
数据库·mysql
格鸰爱童话8 小时前
向AI学习项目技能(五)
java·学习
程序员萌萌8 小时前
Java之mysql实战讲解(三):聚簇索引与非聚簇索引
java·mysql·聚簇索引
好家伙VCC8 小时前
**发散创新:基于Python与ROS的机器人运动控制实战解析**在现代机器人系统开发中,**运动控制**是实现智能行为的核心
java·开发语言·python·机器人