【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这个子字段,查询会直接匹配整个字符串
相关推荐
皮皮林5515 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河5 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
桦说编程8 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅9 小时前
Java面向对象入门(类与对象,新手秒懂)
java
初次攀爬者10 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺10 小时前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
倔强的石头_11 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
Derek_Smart12 小时前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot
NE_STOP13 小时前
MyBatis-mybatis入门与增删改查
java