【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.2.2倒排索引原理与分词器(Analyzer)
👉 点击关注不迷路
👉 点击关注不迷路
👉 点击关注不迷路
文章大纲
- 1.2.2倒排索引原理与分词器(`Analyzer`)
- 1. `倒排索引:搜索引擎的基石`
- 1.1 正排索引 vs 倒排索引
- 示例数据对比:
- 1.2 倒排索引核心结构
- 压缩效果对比(`1亿文档场景`):
- 1.3 性能优化策略
- 2. 分词器(`Analyzer`)工作机制
- 2.1 分词器三层处理流程
- 2.2 内置分词器对比
- 分词性能测试(处理10万条商品标题):
- 2.3 中文分词深度解决方案
- 3. 联合应用实战案例
- 3.1 电商搜索优化
- 3.2 日志多语言处理
- 3.3 敏感词过滤系统
- 4. 性能对比与最佳实践
- 4.1 `倒排索引配置建议`
- 4.2 分词器选择指南
- 4.3 联合优化最佳实践
1.2.2倒排索引原理与分词器(Analyzer)
1. 倒排索引:搜索引擎的基石
1.1 正排索引 vs 倒排索引
| 索引类型 | 数据结构 | 典型查询场景 | 时间复杂度 |
|---|---|---|---|
| 正排索引 | 文档ID → 字段内容 | 已知ID查内容(SELECT *) | O(1) |
| 倒排索引 | 词项 → [文档ID列表] | 关键词搜索(WHERE text LIKE) | O(log n) + O(m) |
示例数据对比:
- 文档集合
| 文档ID | 标题 |
|---|---|
| 1 | Elasticsearch实战 |
| 2 | 搜索引擎核心技术 |
-
正排索引

-
倒排索引

1.2 倒排索引核心结构
- 倒排索引 = 词项字典(
Term Dictionary) + 倒排列表(Posting List)

压缩效果对比(1亿文档场景):
| 存储方式 | 原始大小 | 压缩后大小 | 查询速度 |
|---|---|---|---|
| 未压缩文档ID列表 | 400MB | - | 120ms |
Roaring Bitmaps | 400MB | 15MB | 45ms |
Roaring Bitmaps:是一种用于高效存储和操作稀疏位图(bitmap)的数据结构,通过将一个大的位图分割成多个16位的桶(bucket),每个桶对应一个16位的键值。- 优势
- 节省空间:对于稀疏位图,
Roaring Bitmaps比传统的位图存储方式节省大量的内存空间。 - 高效操作:支持快速的并集、交集、差集等操作,操作速度快。
- 易于扩展:可以方便地处理大规模的位图数据。
- 节省空间:对于稀疏位图,
- 存储方式
- 数组存储:当桶中元素较少时,使用一个短整型数组来存储这些元素。
- 位图存储:当桶中元素较多时,使用传统的位图(
bitmap)来存储。

- 优势
1.3 性能优化策略
-
- 索引分片(
Sharding)
- 将大索引切分为多个分片并行处理
- 示例:
10亿文档索引分为20个分片,查询性能提升8倍
- 索引分片(
-
- 段合并(
Segment Merge)
- 后台自动合并小段为更大段
- 减少打开文件数,提升IO效率
- 典型合并策略:
Tiered Merge PolicyTiered Merge Policy(分层合并策略)是Elasticsearch等搜索引擎中用于管理索引段(Segment)合并的一种策略。- 在搜索引擎中,新的数据写入时会生成新的索引段,
随着时间推移,索引段数量会增多,这会影响查询性能,因此需要对这些索引段进行合并。 Tiered Merge Policy采用分层的方式来管理和合并这些索引段,以平衡合并成本和查询性能。
- 工作原理
- 分层存储:
将索引段按照大小划分为不同的层,每一层中的索引段大小相近。较小的索引段位于较低的层,较大的索引段位于较高的层。 - 合并规则:当
某一层的索引段数量超过一定阈值时,会触发合并操作,将该层的多个索引段合并成一个或多个较大的索引段,并将其提升到上一层。

- 分层存储:
- 段合并(
-
- 禁用不需要的特性
PUT /logs {"mappings": {"_doc": {"properties": {"message": {"type": "text","norms": false, // 禁用评分因子存储"index_options": "freqs" // 不存储位置信息}}}} }
2. 分词器(Analyzer)工作机制
2.1 分词器三层处理流程

示例:处理"Elasticsearch's 中文分词"
-
- 字符过滤器:去除HTML标签、替换缩写(如将
’s替换为空)
→ “Elasticsearch中文分词”
- 字符过滤器:去除HTML标签、替换缩写(如将
-
- 分词器:按空格/标点切分
→ [“Elasticsearch”, “中文”, “分词”]
- 分词器:按空格/标点切分
-
- Token过滤器:转小写、移除停用词
→ [“elasticsearch”, “中文”, “分词”]
- Token过滤器:转小写、移除停用词
2.2 内置分词器对比
| 分词器类型 | 处理逻辑 | 中文支持 | 示例输入 → 输出 |
|---|---|---|---|
| Standard | 按Unicode文本分割,转小写 | 差 | “Elasticsearch实战” → [“elasticsearch”, “实战”] |
| Simple | 非字母字符切分,保留大写 | 无 | “Hello-World” → [“Hello”, “World”] |
| Whitespace | 按空格切分,保留原始大小写 | 无 | “Hello World” → [“Hello”, “World”] |
IK(中文增强) | 智能语义切分 | 优秀 | “搜索引擎” → [“搜索”, “引擎”, “搜索引擎”] |
分词性能测试(处理10万条商品标题):
| 分词器 | 耗时(秒) | 内存占用(GB) | 准确率(F1值) |
|---|---|---|---|
| Standard | 4.2 | 1.8 | 0.62 |
| IK | 6.7 | 2.5 | 0.89 |
Jieba | 5.9 | 2.1 | 0.91 |
2.3 中文分词深度解决方案
-
痛点分析:
歧义切分(如"南京市长江大桥" → 南京/市长/江大桥 或 南京市/长江/大桥)- 新词识别(如网络用语"奥利给")
-
IK分词器实战配置:
PUT /news
{"settings": {"analysis": {"analyzer": {"ik_smart_custom": {"type": "custom","tokenizer": "ik_smart","filter": ["lowercase", "stopwords_filter"]}},"filter": {"stopwords_filter": {"type": "stop","stopwords": ["的", "是", "了"]}}}}
}
3. 联合应用实战案例
3.1 电商搜索优化
- 需求:提升"女士冬季羽绒服"搜索准确率
- 解决方案:
-
- 使用IK分词器配置同义词
"filter": {"synonym_filter": {"type": "synonym","synonyms": ["羽绒服 => 羽绒衣, 羽绒外套"]} }-
- 倒排索引存储词项位置信息
"mappings": {"properties": {"title": {"type": "text","index_options": "offsets" // 存储位置信息用于短语匹配}} } -
- 效果:
- 搜索召回率提升37%
- 相关商品点击率(
CTR)从22%提升至41%
3.2 日志多语言处理
- 场景:国际业务日志含中/英/日文本
- 配置方案:
PUT /logs
{"settings": {"analysis": {"analyzer": {"multi_lang": {"type": "custom","char_filter": ["html_strip"],"tokenizer": "standard","filter": ["lowercase","cjk_width" // 全角转半角(处理日语)]}}}}
}
- 处理效果:
- 日文文本 “エラーメッセージ” → [“エラーメッセージ”]
- 中文文本 “错误信息” → [“错”, “误”, “信”, “息”]
3.3 敏感词过滤系统
- 实现方案:
-
- 自定义字符过滤器
"char_filter": {"sensitive_filter": {"type": "mapping","mappings": ["傻X => **", "垃圾 => **"]} }-
- 在
分词器链中应用
- 在
"analyzer": {"safe_analyzer": {"char_filter": ["sensitive_filter"],"tokenizer": "ik_smart"} } -
- 测试结果:
- 原始文本:“这个产品简直是垃圾!”
- 处理后词项:[“这个”, “产品”, “简直”, “是”, “**”]
4. 性能对比与最佳实践
4.1 倒排索引配置建议
| 场景 | 推荐配置 | 预期收益 |
|---|---|---|
| 高频短语查询 | 启用index_options: positions | 短语查询速度提升3倍 |
| 大文本存储 | 禁用_source字段 + 开启best_compression | 存储空间减少40% |
| 实时性要求高 | 设置refresh_interval: 30s | 写入吞吐量提升120% |
4.2 分词器选择指南
| 场景 | 推荐分词器 | 关键特性 |
|---|---|---|
| 中文搜索 | IK分词器 | 细粒度切分 + 新词识别 |
| 多语言混合 | 标准分词器 + 小写过滤 | 基础分词 + 统一规范化 |
代码/日志分析 | 白名单分词器 | 保留特殊符号(如HTTP_200) |
4.3 联合优化最佳实践
-
- 冷热数据分层
- 热数据:
SSD存储 + 高副本数(保障查询性能) - 冷数据:HDD存储 + 禁用副本(降低成本)

-
- 混合索引策略
PUT /products {"settings": {"index": {"number_of_shards": 6,"number_of_replicas": 1,"analysis": { ... }}},"mappings": {"dynamic_templates": [{"strings_as_keywords": {"match_mapping_type": "string","mapping": { "type": "keyword" }}}]} } -
- 监控与调优
- 使用
_analyzeAPI测试分词效果GET /_analyze {"analyzer": "ik_smart","text": "自然语言处理技术" } - 通过
indices.stats接口监控索引性能
相关文章:
【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.2.2倒排索引原理与分词器(Analyzer)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 1.2.2倒排索引原理与分词器(Analyzer)1. 倒排索引:搜索引擎的基石1.1 正排索引 vs 倒排索引示例数据对比: 1.2 倒排索引核心结…...
salesforce 为什么无法关闭task,显示:insufficient access rights on object id
在 Salesforce 中,如果你在尝试关闭任务(Task)时遇到 “Insufficient access rights on object id” 错误,通常是由于以下几种可能的权限问题导致的: 1. 任务的所有权问题 Salesforce 中的任务(Task&…...
和鲸科技携手四川气象,以 AI 的力量赋能四川气象一体化平台建设
气象领域与农业、能源、交通、环境科学等国计民生关键领域紧密相连,发挥着不可替代的重要作用。人工智能技术的迅猛发展,为气象领域突破困境带来了新的契机。AI 技术能够深度挖掘气象大数据中蕴含的复杂信息,助力人类更精准地把握自然规律&am…...
linux下java Files.copy 提示文件名过长
linux下java Files.copy 提示文件名过长问题排查 系统运行时执行文件拷贝的功能的时候出现了 文件名称过长的报错提示 查询过资料后整理出了每个操作系统支持最大的文件名称长度 每个操作系统现在的文件长度不一样 Linux的 /usr/include/linux/limits.h 中做出了说明 这些限制…...
工业AR眼镜的‘芯’动力:FPC让制造更智能【新立电子】
随着增强现实(AR)技术的快速发展,工业AR智能眼镜也正逐步成为制造业领域的重要工具。它不仅为现场工作人员提供了视觉辅助,还极大地提升了远程协助的效率、优化了仓储管理。新立电子其高性能的FPC产品在AI眼镜中的应用,…...
Metal学习笔记八:纹理
到目前为止,您已经学习了如何使用片段函数和着色器为模型添加颜色和细节。另一种选择是使用图像纹理,您将在本章中学习如何作。更具体地说,您将了解: • UV 坐标:如何展开网格,以便可以对其应用纹理。 • 纹…...
一文5分钟掌握基于JWT的模拟登录爬取实战
文章目录 一、JWT简介1.1 什么是JWT?1.2 JWT的结构1.3 模拟登录流程1.4 爬取数据1.5 实战步骤 二、实战示例:基于JWT的模拟登录爬取2.1 环境准备2.2 分析登录流程2.3 编写模拟登录代码2.4 代码说明 三、处理复杂情况3.1 动态参数3.2 多因素认证3.3 刷新T…...
Idea 和 Pycharm 快捷键
一、快捷键 二、Pycharm 中怎么切换分支 参考如下 如果在界面右下角 没有看到当前所在的分支,如 “Git:master” 3. 有了 4....
fody引用c++的dll合并后提示找不到
fody引用c的dll合并后提示找不到 解决方案: 在 FodyWeavers.xml 文件中添加配置 CreateTemporaryAssemblies‘true’ 官方文档:https://github.com/Fody/Costura <Weavers xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:noN…...
HAL库 IIC写和读函数
IIC写函数:HAL_I2C_Master_Transmit (); IIC读函数:HAL_I2C_Master_Receive ();写和读函数中的从机的地址最后一位由外部硬件电路控制。 int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------…...
初识flutter1
为什么使用flutter, 说直白一点,就是移动UI框架, 个人认为优势是: 1.一套代码adnroid 和ios 可以使用, 代码好维护 2.原生用户界面 3.开源、免费的 开发工具: 1.下载 java 包, 根据自己的电脑配置选择 官网下载: https://www.oracle.com/java/technologies/download…...
12字符函数
一、函数strchr与strrchr 注意: 这两个函数的功能,都是在指定的字符串 s 中,试图找到字符 c。strchr() 从左往右找,strrchr() 从右往左找。字符串结束标记 ‘\0’ 被认为是字符串的一部分。 图解: 示例代码ÿ…...
QT6开发高性能企业视频会议-8 使用VSCode+Copilot AI开发
Github Copilot是Github和OpenAI推出的AI编程辅助工具,之前版本的Github Copilot只有简单的代码自动补全,根据注释生成一些代码等辅助功能。 近期Copilot有了一次大的升级,加入了Agent模式,可以实现自然语言对话讨论和最重要的&a…...
矩阵的奇异值(SVD)分解和线性变换
矩阵的奇异值(SVD)分解和线性变换 SVD定义 奇异值分解(Singular Value Decomposition,简称 SVD)是一种重要的线性代数工具,能够将任意矩阵 ( A ∈ R m n \mathbf{A} \in \mathbb{R}^{m \times n} A∈Rmn…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_rbtree_sentinel_init
ngx_rbtree_sentinel_init 定义在 src\core\ngx_rbtree.h #define ngx_rbt_black(node) ((node)->color 0) /* a sentinel must be black */#define ngx_rbtree_sentinel_init(node) ngx_rbt_black(node)初始化哨兵节点的颜色 将哨兵节点(node&a…...
数据库的sql语句
本篇文章主要用来收集项目开发中,遇到的各种sql语句的编写。 1、根据user表的role_id字段,查询role表。 sql语句:使用JOIN连接两个表 SELECT u.*,r.rolename FROM user u JOIN role r ON u.role_id r.id WHERE u.id 1; 查询结果:…...
Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调
Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调 环境准备创建Python微调环境准备数据集准备模型文件 模型微调模型预测原始模型预测微调模型预测 使用unsloth,可以方便地对大模型进行微调。以微调DeepSeek-R1-Distill-Llama-8B为…...
Bugku CTF Crypto(二)
目录 这不是md5 贝斯家族 把猪困在猪圈里 黄道十二官(宫) 抄错的字符 这不是md5 描 述: 666c61677b616537333538376261353662616566357d 分 析:题目提示这不是md5,字符中出现了d,猜测16进制 使用…...
openssl的aes128_ECB加密解密运算实例
aes128算法ECB接口 加密接口 注意事项: EVP_EncryptInit_ex初始化算法EVP_aes_128_ecb(),和密钥,key至少16BEVP_EncryptUpdate加密运算,tmplen输出已加密长度EVP_EncryptFinal_ex结束运算,如果在此仍有加密运算&…...
单片机总结【GPIO/TIM/IIC/SPI/UART】
一、GPIO 1、概念 通用输入输出口;开发者可以根据自己的需求将其配置为输入或输出模式,以实现与外部设备进行数据交互、控制外部设备等功能。简单来说,GPIO 就像是计算机或微控制器与外部世界沟通的 “桥梁”。 2、工作模式 工作模式性质特…...
动态部署Web应用程序与web.xml配置详解
文章目录 前言一、动态部署Web应用程序1.1 什么是动态部署?1.2 动态部署的步骤1.3 动态部署的优势 二、web.xml 配置文件2.1 什么是web.xml?2.2 web.xml 文件的结构2.2.1常见配置(1) 配置上下文参数(2) 配置Servlet(3)配置过滤器(…...
Rt-thread源码剖析(1)——内核对象
前言 该系列基于rtthread-nano的内核源码,来研究RTOS的底层逻辑,本文介绍RTT的内核对象,对于其他RTOS来说也可供参考,万变不离其宗,大家都是互相借鉴,实现不会差太多。 内核对象容器 首先要明确的一点是什…...
Python 的历史进程
Python:编程世界中的瑞士军刀 在当今数字化飞速发展的时代,编程语言层出不穷,而 Python 无疑是其中一颗耀眼的明珠。它以其简洁优雅的语法、强大的功能以及广泛的应用领域,成为了全球开发者炙手可热的编程语言之一。 Python 是一种…...
十一、大数据治理平台总体功能架构
大数据治理平台的功能架构图中心主题:数据治理 核心重点是建立健全大数据资产管理框架,确保数据质量、安全性、可访问性和合规性。 大数据治理平台总体功能架构图 关键功能领域 1.数据资产平台(左侧) 此部分主要关注数据资产本身…...
STM32——HAL库开发笔记23(定时器4—输入捕获)(参考来源:b站铁头山羊)
定时器有四个通道,这些通道既可以用来作为输入,又可以作为输出。做输入的时候,可以使用定时器对外部输入的信号的时间参数进行测量;做输出的时候,可以使用定时器向外输出精确定时的方波信号。 一、输入捕获 的基本原理…...
爬虫反爬:CSS位置偏移反爬案例分析与实战案例
文章目录 1. 反爬机制概述2. 反爬原理3. 案例分析4. 破解思路5. 实战样例样例1:使用Python和Selenium破解CSS位置偏移反爬样例2:电商网站商品列表CSS位置偏移反爬破解 6. 总结 1. 反爬机制概述 CSS位置偏移反爬是一种常见的反爬虫技术,通过C…...
libGL.so.1: cannot open shared object file: No such file or directory-linux022
in <module> from PyQt5.QtGui import QPixmap, QFont, QIcon ImportError: libGL.so.1: cannot open shared object file: No such file or directory 这个错误信息表示XXXX 在启动时遇到问题,缺少 libGL.so.1 文件。libGL.so.1 是与 OpenGL 图形库相关的共…...
向量数据库milvus部署
官方文档 Milvus vector database documentationRun Milvus in Docker (Linux) | Milvus DocumentationMilvus vector database documentation 按部署比较简单,这里说一下遇到的问题 一:Docker Compose 方式部署 1、镜像无法拉取,(docker.io被禁) …...
修改`FSL Yocto Project Community BSP`用到的u-boot源码,使其能适配百问网(100ask)的开发板
前言 在博文 https://blog.csdn.net/wenhao_ir/article/details/145547974 中,我们利用官方提供的BSP(FSL Yocto Project Community BSP)构建了写到SD卡中的完整镜像,然后启动后发现存在不少问题,首要的问题就是u-boot不能识别网卡,在这篇博文中,我们就找到FSL Yocto Pro…...
(python)Arrow库使时间处理变得更简单
前言 Arrow库并不是简单的二次开发,而是在datetime的基础上进行了扩展和增强。它通过提供更简洁的API、强大的时区支持、丰富的格式化和解析功能以及人性化的显示,填补了datetime在某些功能上的空白。如果你需要更高效、更人性化的日期时间处理方式,Arrow库是一个不错的选择…...
