【实战 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 Policy
Tiered 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" }}}]} }
-
- 监控与调优
- 使用
_analyze
API测试分词效果GET /_analyze {"analyzer": "ik_smart","text": "自然语言处理技术" }
- 通过
indices.stats
接口监控索引性能
相关文章:

【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.2.2倒排索引原理与分词器(Analyzer)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 1.2.2倒排索引原理与分词器(Analyzer)1. 倒排索引:搜索引擎的基石1.1 正排索引 vs 倒排索引示例数据对比: 1.2 倒排索引核心结…...
Vue.js响应式基础
响应式基础 API 参考 本页和后面很多页面中都分别包含了选项式 API 和组合式 API 的示例代码。现在你选择的是 组合式 API。你可以使用左侧侧边栏顶部的“API 风格偏好”开关在 API 风格之间切换。 声明响应式状态 ref() 在组合式 API 中,推荐使用 ref() 函数来声明…...
DeepSeek-OpenSourceWeek-第四天-Optimized Parallelism Strategies
DeepSeek 在 #OpenSourceWeek(开源周) 的第四天推出了两项新工具,旨在让深度学习更快、更高效:**DualPipe** 和 **EPLB**。 DualPipe 定义:DualPipe 是一种用于 V3/R1 训练中计算与通信重叠的双向pipline并行算法。 作用:它通过实现前向和后向计算-通信阶段的完全重叠,减…...
深入浅出:插入排序算法完全解析
1. 什么是插入排序? 插入排序(Insertion Sort)是一种简单的排序算法,其基本思想与我们整理扑克牌的方式非常相似。我们将扑克牌从第二张开始依次与前面已排序的牌进行比较,将其插入到合适的位置,直到所有牌…...

【Keras图像处理入门:图像加载与预处理全解析】
本文将全面讲解如何使用Keras进行图像加载、预处理和数据增强,为深度学习模型准备高质量的图像数据。 一、单张图像处理基础 1. 图像加载与尺寸调整 from keras.preprocessing import image# 加载图像并调整尺寸 img image.load_img(example.jpg, target_size(1…...
企业级AI办公落地实践:基于钉钉/飞书的标准产品解决方案
一、平台化AI的崛起:开箱即用的智能革命 2024年企业AI应用调研数据显示: 73%的中型企业选择平台标准产品而非自研头部SaaS平台AI功能渗透率达89%典型ROI周期从18个月缩短至3-6个月 核心优势对比: 维度自研方案平台标准产品部署周期6-12个…...
对于邮箱地址而言,短中划线(Hyphen, -)和长中划线(Em dash, —)有区别吗
对于邮箱地址而言,**短中划线(Hyphen, -)和长中划线(Em dash, —)**有明确的区别: 短中划线(Hyphen, -): 在邮箱地址中,短中划线是可以使用的,通常…...
C++ STL(三)list
目录 list是什么 构造函数 元素访问 容量操作 修改 迭代器 code实例 实现简单的list forward_list是什么 构造函数 元素访问 容量 修改 迭代器 code实例 实现一个简单的forward_list list是什么 std::list 是 C 标准模板库(STL)中的一个…...
Vue3+TypeScript 封装一个好用的防抖节流自定义指令
一、前言:为什么需要防抖节流? 在前端开发中,高频触发的事件(如滚动、输入、点击等)容易导致性能问题。防抖(debounce) 和 节流(throttle) 是两种常用的优化手段&#x…...
HarmonyOS+Django实现图片上传
话不多说,直接看代码: HarmonyOS部分代码 import { router } from "kit.ArkUI" import PreferencesUtil from "../utils/PreferencesUtil" import { photoAccessHelper } from "kit.MediaLibraryKit" import fs from oh…...
vscode 版本
vscode官网 Visual Studio Code - Code Editing. Redefined 但是官网只提供最新 在之前的版本就要去github找了 https://github.com/microsoft/vscode/releases 获取旧版本vscode安装包的方法_vscode 老版本-CSDN博客...

Python 爬虫实战案例 - 获取拉勾网招聘职位信息
引言 拉勾网,作为互联网招聘领域的佼佼者,汇聚了海量且多样的职位招聘信息。这些信息涵盖了从新兴科技领域到传统行业转型所需的各类岗位,无论是初出茅庐的应届生,还是经验丰富的职场老手,都能在其中探寻到机遇。 对…...

结构型模式---外观模式
概念 外观模式是一种结构型设计模式,它的核心思想是为复杂的子系统提供一个统一的接口,简化客户端与子系统的交互。外观模式通过引入一个高层接口,隐藏子系统的复杂性,使客户端更容易使用。 适用场景 用于客户端无需具体操作子…...
Docker数据卷操作实战
什么是数据卷 数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性: 数据卷 可以在容器之间共享和享用对 数据卷 的修改立马生效对 数据卷 的更新,不会影响镜像数据卷 默认会一直存在,即时容器被…...

技术速递|Copilot Usage Advanced Dashboard 教程
作者:Xuefeng Yin 排版:Alan Wang Copilot Usage Advanced Dashboard 是为了充分利用 GitHub Copilot API 中的几乎所有数据,用到的 API 有: List teams of an onganization Get a summary of Copilot metrics for a team Get C…...
【Python爬虫(90)】以Python爬虫为眼,洞察金融科技监管风云
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取,还涉及数据处理与分析。无论是新手小白还是进阶开发…...
Shell学习(1/6) 教程-变量
一、教程 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。 Shell…...

《Qt窗口动画实战:Qt实现呼吸灯效果》
Qt窗口动画实战:Qt实现呼吸灯效果 在嵌入式设备或桌面应用中,呼吸灯效果是一种常见且优雅的UI动画,常用于指示系统状态或吸引用户注意。本文将介绍如何使用Qt动画框架实现平滑的呼吸灯效果。 一、实现原理 利用Qt自带的动画框架来实现&…...
RabbitMQ系列(六)基本概念之Routing Key
在 RabbitMQ 中,Routing Key(路由键) 是用于将消息从交换机(Exchange)路由到指定队列(Queue)的关键参数。其核心作用是通过特定规则匹配绑定关系,确保消息被正确分发。以下是其核心机…...
Spring Boot 集成 Kafka
在现代软件开发中,分布式系统和微服务架构越来越受到关注。为了实现系统之间的异步通信和解耦,消息队列成为了一种重要的技术手段。Kafka 作为一种高性能、分布式的消息队列系统,被广泛应用于各种场景。而 Spring Boot 作为一种流行的 Java 开…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...