【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这个子字段,查询会直接匹配整个字符串
相关推荐
lusasky4 小时前
Claude Code v2.1.0+ 版本集成LSP
大数据·数据库·人工智能
weixin199701080165 小时前
加盟网 item_search - 根据关键词获取行业列表接口对接全攻略:从入门到精通
java·python
EliseL5 小时前
SuperMap iObjects Java 如何将3DTiles数据转换为S3M三维瓦片
java·3d·三维
cyforkk5 小时前
11、Java 基础硬核复习:常用类和基础API的核心逻辑与面试考点
java·python·面试
全栈师5 小时前
java和C#的基本语法区别
java·开发语言·c#
凯子坚持 c5 小时前
Qt常用控件指南(7)
服务器·数据库·qt
diediedei5 小时前
Python字典与集合:高效数据管理的艺术
jvm·数据库·python
气可鼓不可泄5 小时前
将dmpython 封装在容器镜像里
数据库·python
m0_561359675 小时前
超越Python:下一步该学什么编程语言?
jvm·数据库·python
mango_mangojuice5 小时前
Linux学习笔记 1.19
linux·服务器·数据库·笔记·学习