【实战 ES】实战 Elasticsearch:快速上手与深度实践-2.1.2字段类型选择:keyword vs text、nested对象
👉 点击关注不迷路
👉 点击关注不迷路
👉 点击关注不迷路
文章大纲
- 第2章 数据建模与高效写入:ES字段类型选择最佳实践:keyword vs text与nested对象深度解析
- 1. 索引设计核心原则
- 2. `keyword`与`text`类型终极对决
- 2.1 核心差异对比
- 2.2 性能基准测试数据
- 2.3 经典使用场景
- 3. `nested`对象深度解析
- 3.1 问题背景:`对象数组的扁平化---理解体会到扁平化这个词`
- 3.2 `nested`类型解决方案
- 3.3 nested与普通对象对比
- 3.4 性能影响测试
- 4. 实战案例:电商平台商品模型设计
- 4.1 需求分析
- 4.2 最终映射设计
- 4.3 查询示例:查找红色库存>100的商品
- 5. 最佳实践总结
- 5.1 类型选择决策树
- 5.2 黄金法则
- 5.3 常见误区
- 附录:性能优化参数参考
第2章 数据建模与高效写入:ES字段类型选择最佳实践:keyword vs text与nested对象深度解析
1. 索引设计核心原则
在Elasticsearch中,字段类型的选择直接影响以下关键指标:
| 影响维度 | 说明 | 典型场景示例 |
|---|---|---|
| 查询性能 | 类型选择错误可能导致查询延迟增加5-10倍 | 使用text类型进行精确匹配 |
| 存储效率 | 合理的类型可减少20-50%的磁盘占用 | 数值类型误设为keyword |
| 聚合准确性 | 错误类型会导致cardinality聚合误差率高达30% | 高基数字段使用text类型进行聚合 |
| 功能支持 | 特定功能(如地理位置查询)必须使用专用类型 | geo_point用于地理位置查询 |
cardinality是Elasticsearch中的一种聚合类型,它可以对指定字段中的唯一值进行近似计数。- 这里的 “近似” 是因为为了在处理大规模数据时提高性能和减少内存使用,
cardinality采用了HyperLogLog++算法(算法的核心思想基于伯努利试验和概率统计)来估算唯一值的数量,而不是精确统计。
- 这里的 “近似” 是因为为了在处理大规模数据时提高性能和减少内存使用,
2. keyword与text类型终极对决
2.1 核心差异对比
| 特性 | keyword类型 | text类型 |
|---|---|---|
| 分词处理 | 不进行分词 | 默认使用标准分词器 |
| 存储结构 | 原始值完整存储 | 分词后存储倒排索引 |
| 查询方式 | 精确匹配(term查询) | 全文搜索(match查询) |
| 排序支持 | 完全支持 | 需要开启fielddata(消耗内存) |
| 聚合性能 | 高效,适合terms聚合 | 需要额外配置fielddata,性能较差 |
典型应用场景 | 标签、状态码、分类ID | 文章内容、产品描述、日志详情 |
| 存储开销 | 每个值独立存储 | 分词后存储,可能有重复token |
| 模糊查询 | 支持wildcard(性能差) | 支持多种分词器(如ngram) |
2.2 性能基准测试数据
- 测试环境:3节点集群(16核32GB,NVMe SSD),数据集:1000万条商品记录
| 测试场景 | keyword类型耗时 | text类型耗时 | 性能差异 |
|---|---|---|---|
| 精确匹配查询(term) | 23ms | 520ms | 22.6倍 |
| 全文搜索(match) | N/A | 45ms | - |
| terms聚合(1000桶) | 680ms | 4200ms | 6.2倍 |
| 存储空间占用 | 12.4GB | 18.7GB | 1.5倍 |
2.3 经典使用场景
- 适用
keyword的情况:
{"product_id": {"type": "keyword"},"category": {"type": "keyword","ignore_above": 256 // 自动截断超长字段},"status": {"type": "keyword"} // 状态枚举值
}
- 适用
text的情况:analyzer(分析器):将文本拆分成一个个独立的词项(term),并可对这些词项进行一系列处理,如转换大小写、去除停用词等。ik_max_word分词器特点ik_max_word是IK分词器提供的一种分词模式。IK 分词器是一款专门为中文文本处理设计的开源分词器,在Elasticsearch中被广泛应用。ik_max_word模式具有以下特点:- 最大切分粒度:它会将文本进行最细粒度的拆分,尽可能地将文本拆分成更多的有意义的词。例如,对于 “研究生命起源” 这句话,
ik_max_word会将其拆分为 “研究”“研究生”“生命”“起源” 等词项,这样可以提高搜索的召回率,让更多可能相关的文档被检索出来。 - 智能识别:能够智能识别中文词汇,包括一些常见的专业术语、人名、地名等,使得分词结果更符合中文语言习惯。
- 最大切分粒度:它会将文本进行最细粒度的拆分,尽可能地将文本拆分成更多的有意义的词。例如,对于 “研究生命起源” 这句话,
{"product_description": {"type": "text","analyzer": "ik_max_word", // 使用中文分词器"fields": {"keyword": {"type": "keyword"} // 多字段特性}}
}
3. nested对象深度解析
3.1 问题背景:对象数组的扁平化---理解体会到扁平化这个词
- 普通对象数组存储方式:
{"order_id": "1001","items": [{"sku": "A001", "price": 99},{"sku": "B002", "price": 199}]
}
- 实际存储结构:
{"order_id": "1001","items.sku": ["A001", "B002"],"items.price": [99, 199]
}
3.2 nested类型解决方案
{"order": {"properties": {"items": {"type": "nested","properties": {"sku": {"type": "keyword"},"price": {"type": "double"}}}}}
}
3.3 nested与普通对象对比
| 特性 | nested类型 | 普通对象数组 |
|---|---|---|
| 存储方式 | 独立隐藏文档 | 扁平化存储 |
| 查询准确性 | 精确维护对象关系 | 可能产生跨对象匹配 |
写入性能 | 比普通对象慢2-3倍 | 最优 |
| 查询性能 | 需要特殊查询语法,较慢 | 标准查询语法 |
| 适用场景 | 需要精确维护对象关系的场景 | 不需要维护关系的简单数组 |
| 内存消耗 | 每个nested对象单独索引 | 整体作为字段处理 |
3.4 性能影响测试
- 测试数据集:500万订单记录,每个订单平均3个商品项
| 操作类型 | nested类型耗时 | 普通对象耗时 | 差异倍数 |
|---|---|---|---|
| 写入吞吐量 | 1,200 docs/s | 3,800 docs/s | 3.2倍 |
| 嵌套查询 | 220ms | 35ms | 6.3倍 |
| 聚合分析 | 1.8s | 0.9s | 2倍 |
| 存储空间 | 143GB | 89GB | 1.6倍 |
4. 实战案例:电商平台商品模型设计
4.1 需求分析
- 商品基础信息
- 多规格
SKU管理 - 用户评论情感分析
- 实时库存查询
4.2 最终映射设计
{"mappings": {"properties": {"product_id": {"type": "keyword"},"title": {"type": "text","analyzer": "ik_smart","fields": {"keyword": {"type": "keyword"}}},"categories": {"type": "keyword"},"specs": {"type": "nested","properties": {"color": {"type": "keyword"},"size": {"type": "keyword"},"stock": {"type": "integer"}}},"reviews": {"type": "nested","properties": {"user_id": {"type": "keyword"},"content": {"type": "text"},"rating": {"type": "byte"}}}}}
}
ik_smart是IK分词器提供的一种分词模式。IK分词器是专为中文文本处理打造的开源分词器,在Elasticsearch社区被广泛应用。ik_smart模式具有以下显著特点:- 最少切分原则:它会尽可能将文本进行最粗粒度的拆分,以最少的词数来表达文本的语义。例如,对于 “研究生命起源” 这句话,
ik_smart会将其拆分为 “研究”“生命起源”,这种切分方式更注重整体语义的表达。 - 高效简洁:由于分词结果的词数相对较少,
在处理大规模文本时,ik_smart 可以减少索引的大小,提高搜索效率,同时也能一定程度上降低计算资源的消耗。 - 使用场景
- 对搜索效率要求高的场景:当需要快速处理大量中文文本搜索请求时,
ik_smart是一个不错的选择。例如,在电商网站的商品搜索功能中,用户输入搜索关键词后,系统需要迅速返回相关商品列表,使用ik_smart可以加快搜索速度,提升用户体验。 - 注重整体语义匹配的场景:在一些对文本整体语义理解要求较高的搜索场景中,
ik_smart的粗粒度分词能够更好地捕捉文本的核心语义。比如,在企业知识管理系统中搜索相关文档时,用户更关注的是文档的整体主题,ik_smart可以帮助找到更符合主题的文档。
- 对搜索效率要求高的场景:当需要快速处理大量中文文本搜索请求时,
- 最少切分原则:它会尽可能将文本进行最粗粒度的拆分,以最少的词数来表达文本的语义。例如,对于 “研究生命起源” 这句话,
4.3 查询示例:查找红色库存>100的商品
{"query": {"nested": {"path": "specs","query": {"bool": {"must": [{"term": {"specs.color": "red"}},{"range": {"specs.stock": {"gt": 100}}}]}}}}
}
5. 最佳实践总结
5.1 类型选择决策树
5.2 黄金法则
-
- 标识性原则:唯一标识符必须使用
keyword
- 标识性原则:唯一标识符必须使用
-
- 长度控制:超过
256字符的keyword字段需设置ignore_above
- 长度控制:超过
-
- 混合使用:重要文本字段应
同时设置text和keyword
- 混合使用:重要文本字段应
-
- 性能代价:
nested类型要严格控制数组长度
- 性能代价:
-
- 版本兼容:
7.x以上版本优先使用keyword替代string类型
- 版本兼容:
5.3 常见误区
| 错误场景 | 后果 | 解决方案 |
|---|---|---|
| 对text字段进行term查询 | 返回结果不准确 | 使用match查询或.keyword字段 |
| 过度使用nested类型 | 写入性能急剧下降 | 评估是否真正需要对象关系维护 |
| 大数组存储为keyword | 导致mapping爆炸 | 使用flattened类型替代 |
数值字段设为text | 范围查询效率降低80% | 严格使用数值类型 |
附录:性能优化参数参考
// keyword字段优化
// "category" 字段用于存储分类信息,将其类型设置为 "keyword",适用于精确匹配和聚合操作
"category": {"type": "keyword",// eager_global_ordinals 设置为 true 表示预加载全局序数// 全局序数是 Elasticsearch 用于优化聚合操作的一种数据结构// 预加载全局序数可以加快聚合查询的速度,因为在查询时无需再动态计算// 但是,这会增加内存开销,尤其是在数据量较大时// 因此,仅在需要频繁进行聚合操作且内存充足的情况下使用"eager_global_ordinals": true
},// nested字段优化
// "specs" 字段用于存储产品规格等嵌套数据,将其类型设置为 "nested"
// "nested" 类型允许在文档中嵌套子文档,并且可以对子文档进行独立的查询和聚合
"specs": {"type": "nested",// include_in_parent 设置为 true 表示允许父文档查询嵌套字段// 这意味着在查询父文档时,可以同时匹配嵌套字段的条件// 然而,这种方式会增加查询的复杂度和性能开销,因为需要在父文档和嵌套文档之间进行额外的关联操作// 所以,使用时需要谨慎评估,仅在确实需要进行此类跨层级查询时启用"include_in_parent": true
}相关文章:
【实战 ES】实战 Elasticsearch:快速上手与深度实践-2.1.2字段类型选择:keyword vs text、nested对象
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 第2章 数据建模与高效写入:ES字段类型选择最佳实践:keyword vs text与nested对象深度解析1. 索引设计核心原则2. keyword与text类型终极对决2.1 核心…...
【前端基础】Day 3 CSS-2
目录 1. Emmet语法 1.1 快速生成HTML结构语法 1.2 快速生成CSS样式语法 2. CSS的复合选择器 2.1 后代选择器 2.2 子选择器 2.3 并集选择器 2.4 伪类选择器 2.4.1 链接伪类选择器 2.4.2 focus伪类选择器 2.5 复合选择器总结 3. CSS的元素显示模式 3.1 什么是元素显示…...
windows电脑上安装llama-factory实现大模型微调
一、安装环境准备 这是官方给的llama-factory安装教程,安装 - LLaMA Factory,上面介绍了linux系统上以及windows系统上如何正确安装。大家依照安装步骤基本能够完成安装,但是可能由于缺少经验或者相关的知识导致启动webUi界面运行相应内容时…...
汽车无人驾驶系统中的防撞设计
一、系统方案介绍 无人驾驶汽车的防撞系统是保障行车安全的核心模块,本文设计的系统以STM32F103C8T6单片机为主控制器,结合超声波测距、WiFi通信、人机交互等模块,实现障碍物实时检测、动态阈值设置、多级报警和数据可视化功能。系统通过软…...
sql server 版本更新日期
SQL Server 2019 内部版本(KB4518398) - SQL Server | Microsoft Learn SQL Server 的最新更新和版本历史记录 - SQL Server | Microsoft Learn sql server 2019 版本更新时间和补丁版本号...
Linux网络 DNS
DNS(Domain Name System) TCP/IP 中使用 IP 地址和端口号来确定网络上的一台主机的一个程序 , 但是 IP 地址不方便记忆。于是人们发明了一种叫主机名的东西, 是一个字符串 , 并且使用 hosts 文件来描述主机名和 IP 地址的关系 。 最初 , 通过互连网信息中…...
EMQX中不同端口对应的接入协议
使用tcp接入时应使用mqtt://IP:1883 使用ws接入时应使用ws://IP:8083...
SpringBoot原理-03.自动配置-方案
一.自动配置原理 探究自动配置原理,就是探究spring是如何在运行时将要依赖JAR包提供的配置类和bean对象注入到IOC容器当中。我们当前准备一个maven项目itheima-utils,这里面定义了bean对象以及配置类,用来模拟第三方提供的依赖,首…...
Python 如何实现烟花效果的完整代码
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
Winbox5怎样设置上网
要让连接到交换机的设备都能上网,需在MikroTik路由器(通过WinBox配置)上完成以下步骤。假设您的网络拓扑是:外网IP配置在路由器的WAN口,内网设备通过交换机连接到路由器的LAN口。 步骤 1:配置内网接口&…...
(KTransformers) RTX4090单卡运行 DeepSeek-R1 671B
安装环境为:ubuntu 22.04 x86_64 下载模型 编辑文件vim url.list 写入如下内容 https://modelscope.cn/models/unsloth/DeepSeek-R1-GGUF/resolve/master/DeepSeek-R1-Q4_K_M/DeepSeek-R1-Q4_K_M-00001-of-00009.gguf https://modelscope.cn/models/unsloth/Dee…...
【软考-架构】1.2、指令系统-存储系统-cache
GitHub地址:https://github.com/tyronczt/system_architect ✨资料&文章更新✨ 指令系统 计算机指令执行过程:取指令一一分析指令一一执行指令三个步骤,首先将程序计数器PC中的指令地址取出,送入地址总线,CPU依据…...
CI/CD与容器化技术核心知识点的QA
CI/CD与容器化技术核心知识点的Q&A 以下是CI/CD和容器化技术的经典必考面试题及详解,结合行业实践与理论核心整理而成: 一、CI/CD核心概念与流程 简述CI/CD的核心目标与实现价值 答案:通过自动化流水线实现快速、可靠的软件交付,减少人工干预,提升开发与运维协作效率…...
动态规划刷题
文章目录 动态规划三步问题题目解析代码 动态规划 1. 状态表示:dp[i],表示dp表中i下标位置的值 2. 状态转移方程:以i位置位置的状态,最近的一步来划分问题,比如可以将状态拆分成前状态来表示现状态,dp[i] …...
不谓侠--记录
音乐《不谓侠》 衣襟上 别好了晚霞 余晖送我牵匹老马 正路过 烟村里人家 恰似当年故里正飞花 醉过风 喝过茶 寻常巷口寻个酒家 在座皆算老友 碗底便是天涯 天涯远 无处不为家 蓬门自我也像广厦 论意气 不计多或寡 占三分便敢自称为侠 刀可捉 拳也耍 偶尔闲来…...
2025-03-01 学习记录--C/C++-C语言 整数类型对比
C语言 整数类型对比 类型位数范围(有符号)范围(无符号)格式化符号char8-128 到 1270 到 255%c 或 %hhdshort16-32,768 到 32,7670 到 65,535%hdint32-2,147,483,648 到 2,147,483,6470 到 4,294,967,295%dlong32 或 64-2,147,483…...
Python核心技术,Django学习基础入门教程(附环境安装包)
文章目录 前言1. 环境准备1.1Python安装1.2选择Python开发环境1.3 创建虚拟环境1.4 安装 Django 2. 创建 Django 项目3. Django项目结构介绍4. 启动开发服务器5. 创建 Django 应用6. 应用结构介绍7. 编写视图函数8. 配置 URL 映射9. 运行项目并访问视图10. 数据库配置与模型创建…...
MFC中CMutex类和CSingleLock类,配合使用疑惑
在使用CMutex过程中,看到别人使用了CSingleLock类,想着明明CMutex已经可以实现线程同步了,为什么还有使用CSingleLock类呢? 在MFC中,虽然CMutex类本身可以实现线程同步,但通常会与CSingleLock类一起使用&am…...
爬虫系列之【数据解析之正则】《二》
目录 前言 一、正则基本使用 1.1 导包 1.2 接口方法 1.3 换行匹配问题 二、实战案例 完整代码 前言 在爬虫工作中,我们主要会遇到两种类型的文本数据: JSON格式数据 HTML文档数据 对于JSON字符串数据,通常使用Python的字典操作进行键…...
HTML AI 编程助手
HTML AI 编程助手 引言 随着人工智能技术的飞速发展,编程领域也迎来了新的变革。HTML,作为网页制作的基础语言,与AI技术的结合,为开发者带来了前所未有的便利。本文将探讨HTML AI编程助手的功能、应用场景以及如何利用它提高编程…...
RFID工具柜DW-G104R|智能存储,便捷高效
一、行业背景 RFID智能工具柜(DW-G104R)RFID工具管理柜是一种结合RFID技术和智能柜设备的新型工具管理设施,通过自动化管理可以提高工具管理的效率和准确性。 在工业生产中,工具柜是工具存储和管理的重要设备。传统工具柜存在管…...
【前端面试】如何不通过正则:验证IP地址合法性
前言 在 Web 开发中,验证用户输入的 IP 地址是否合法是一个常见需求 面试中也会问到 通常,我们会使用正则表达式来完成这个任务,因为它简洁高效。然而,正则表达式对于初学者来说可能有些晦涩难懂。本文将介绍一种不使用正则表达…...
中间件专栏之Redis篇——Redis的三大持久化方式及其优劣势对比
Redis是内存数据库,它的数据一般存放在内存中,一旦断电或者宕机,存在内存中的数据就会丢失。当然,它也具备数据持久化的能力,本文就将介绍Redis的三种持久化方式及其优劣势对比。 一、RDB(Redis Database&…...
Linux软连接与时区日期
软连接 使用ln命令创建软连接。 在系统中创建软连接,可以将文件,文件夹连接到其他为止。 类似于Windows系统的快捷方式。 语法:ln -s 参数1 参数2 -s选项,创建软连接。 参数1,被链接的文件或文件夹。 参数2࿰…...
安全测试之五:SQL Server注入漏洞几个实例
示例 1:在 GET 请求中测试 SQL 注入 最简单且有时最有效的情况是针对登录页面进行测试。当登录页面请求用户输入用户名和密码时,攻击者可以尝试输入以下字符串 “ or 11”(不包含双引号): https://vulnerable.web.ap…...
2024 ChatGPT大模型技术场景与商业应用视频精讲合集(45课).zip
2024ChatGPT大模型技术场景与商业应用视频精讲合集,共十三章,45课。 01. 第一章 ChatGPT:通用人工智能的典范 1.1 ChatGPT概述 .mp4 1.2 通用能力 .mp4 1.3 通用人工智能风口 .mp4 02. 第二章 大模型:ChatGPT的核心支撑 2.1 底层…...
HTTP四次挥手是什么?
四次挥手,这是TCP协议用来关闭连接的过程。四次挥手是确保两个主机之间能够安全、可靠地关闭连接的重要机制。我会用简单易懂的方式来讲解,帮助你理解它的原理和过程。 1. 什么是四次挥手? 定义 四次挥手是TCP协议用来关闭连接的过程。它通…...
前端内存泄漏的几种情况及方案
前端内存泄漏是常见但容易被忽视的问题,可能导致页面卡顿、崩溃或性能下降。以下是几种典型场景及解决方案: 1. 未清理的全局变量 场景: 意外创建全局变量(未使用 var/let/const)。主动挂载到 window 的大对象未释放…...
人工智能之数学基础:线性代数中的特殊矩阵
本文重点 矩阵是数学中一个重要的工具,在各个领域都有广泛的应用。其中,一些特殊矩阵由于具有独特的性质,在特定的问题中发挥着关键作用。 单位矩阵 单位矩阵是一种特殊的方阵,在矩阵乘法中起到类似于数字 “1” 的作用。对于一个的单位矩阵,其主对角线元素全为 1,其余…...
单例模式---是 Spring 容器的核心特性之一
1.最近面试让手写一个单例;我一直知道单例;但是一直很困惑;工作中也没怎么用过;为什么面试总问;今天我才知道思考出来;单例是spring容器的核心特性;很多知识我只知道是什么;但是没有…...
