【实战 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 LIKEO(log n) + O(m)
示例数据对比:
  • 文档集合
文档ID标题
1Elasticsearch实战
2搜索引擎核心技术
  • 正排索引
    在这里插入图片描述

  • 倒排索引
    在这里插入图片描述

1.2 倒排索引核心结构

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

1.3 性能优化策略

    1. 索引分片(Sharding
    • 将大索引切分为多个分片并行处理
    • 示例:10亿文档索引分为20个分片,查询性能提升8倍
    1. 段合并(Segment Merge
    • 后台自动合并小段为更大段
    • 减少打开文件数,提升IO效率
    • 典型合并策略:Tiered Merge Policy
      • Tiered Merge Policy(分层合并策略)是 Elasticsearch 等搜索引擎中用于管理索引段(Segment)合并的一种策略。
      • 在搜索引擎中,新的数据写入时会生成新的索引段,随着时间推移,索引段数量会增多,这会影响查询性能,因此需要对这些索引段进行合并。
      • Tiered Merge Policy 采用分层的方式来管理和合并这些索引段,以平衡合并成本和查询性能。
    • 工作原理
      • 分层存储将索引段按照大小划分为不同的层,每一层中的索引段大小相近。较小的索引段位于较低的层,较大的索引段位于较高的层。
      • 合并规则:当某一层的索引段数量超过一定阈值时,会触发合并操作,将该层的多个索引段合并成一个或多个较大的索引段,并将其提升到上一层。
        在这里插入图片描述
    1. 禁用不需要的特性
    PUT /logs
    {"mappings": {"_doc": {"properties": {"message": {"type": "text","norms": false,      // 禁用评分因子存储"index_options": "freqs"  // 不存储位置信息}}}}
    }
    

2. 分词器(Analyzer)工作机制

2.1 分词器三层处理流程

在这里插入图片描述

示例:处理"Elasticsearch's 中文分词"

    1. 字符过滤器:去除HTML标签、替换缩写(如将’s替换为空)
      → “Elasticsearch 中文分词”
    1. 分词器:按空格/标点切分
      → [“Elasticsearch”, “中文”, “分词”]
    1. Token过滤器:转小写、移除停用词
      → [“elasticsearch”, “中文”, “分词”]

2.2 内置分词器对比

分词器类型处理逻辑中文支持示例输入 → 输出
Standard按Unicode文本分割,转小写“Elasticsearch实战” → [“elasticsearch”, “实战”]
Simple非字母字符切分,保留大写“Hello-World” → [“Hello”, “World”]
Whitespace按空格切分,保留原始大小写“Hello World” → [“Hello”, “World”]
IK(中文增强)智能语义切分优秀“搜索引擎” → [“搜索”, “引擎”, “搜索引擎”]
分词性能测试(处理10万条商品标题):
分词器耗时(秒)内存占用(GB)准确率(F1值)
Standard4.21.80.62
IK6.72.50.89
Jieba5.92.10.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 电商搜索优化

  • 需求:提升"女士冬季羽绒服"搜索准确率
  • 解决方案
      1. 使用IK分词器配置同义词
    "filter": {"synonym_filter": {"type": "synonym","synonyms": ["羽绒服 => 羽绒衣, 羽绒外套"]}
    }
    
      1. 倒排索引存储词项位置信息
    "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 敏感词过滤系统

  • 实现方案
      1. 自定义字符过滤器
    "char_filter": {"sensitive_filter": {"type": "mapping","mappings": ["傻X => **", "垃圾 => **"]}
    }
    
      1. 分词器链中应用
    "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 联合优化最佳实践

    1. 冷热数据分层
    • 热数据:SSD存储 + 高副本数(保障查询性能)
    • 冷数据:HDD存储 + 禁用副本(降低成本)
      在这里插入图片描述
    1. 混合索引策略
    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" }}}]}
    }
    
    1. 监控与调优
    • 使用_analyzeAPI测试分词效果
      GET /_analyze
      {"analyzer": "ik_smart","text": "自然语言处理技术"
      }
      
    • 通过indices.stats接口监控索引性能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/896814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot项目本地连接并操作MySQL数据库

目录 前提 准备工作 用cmd在本地创建数据库、表: 1.创建springboot项目(已有可跳过) 2.编辑Mybatis配置 3.连接数据库 4.创建模型类,用于与数据库里的数据表相连 5.创建接口mapper,定义对数据库的操作 6.创建…

《宝塔 Nginx SSL 端口管理实战指南:域名解析、端口冲突与后端代理解析》

📢 Nginx & SSL 端口管理分析 1️⃣ 域名解析与 SSL 申请失败分析 在使用宝塔申请 www.mywebsite.test 的 SSL 证书时,遇到了解析失败的问题。最初,我认为 www 只是一个附加的前缀,不属于域名的关键部分,因此只为…

java和Springboot和vue开发的企业批量排班系统人脸识别考勤打卡系统

演示视频: https://www.bilibili.com/video/BV1KU9iYsEBU/?spm_id_from888.80997.embed_other.whitelist&t52.095574&bvidBV1KU9iYsEBU 主要功能: 管理员管理员工,采集员工人脸特征值存入数据库,可选择多个员工批量排班…

DeepSeek学习规划

DeepSeek是一个专注于深度学习和人工智能技术研究与应用的平台,旨在通过系统化的学习和实践,帮助用户掌握深度学习领域的核心知识和技能。为了在DeepSeek平台上高效学习,制定一个科学合理的学习规划至关重要。以下是一个详细的学习规划&#…

打开 Windows Docker Desktop 出现 Docker Engine Stopped 问题

一、关联文章: 1、Docker Desktop 安装使用教程 2、家庭版 Windows 安装 Docker 没有 Hyper-V 问题 3、安装 Windows Docker Desktop - WSL问题 二、问题解析 打开 Docker Desktop 出现问题,如下: Docker Engine Stopped : Docker引擎停止三、解决方法 1、检查服务是否…

突破Ajax跨域困境,解锁前端通信新姿势

一、引言 在当今的 Web 开发领域,前后端分离的架构模式已经成为主流,它极大地提升了开发效率和项目的可维护性。在这种开发模式下,前端通过 Ajax 技术与后端进行数据交互,然而,跨域问题却如影随形,成为了开…

Mercury、LLaDA 扩散大语言模型

LLaDA 参考: https://github.com/ML-GSAI/LLaDA https://ml-gsai.github.io/LLaDA-demo/ 在线demo: https://huggingface.co/spaces/multimodalart/LLaDA Mercury 在线demo: https://chat.inceptionlabs.ai/ 速度很快生成

Rust~String、str、str、String、Box<str> 或 Box<str>

Rust语言圣经中定义 str Rust 语言类型大致分为两种:基本类型和标准库类型,前者由语言特性直接提供,后者在标准库中定义 str 是唯一定义在 Rust 语言特性中的字符串,但也是几乎不会用到的字符串类型 str 字符串是 DST 动态大小…

大数据SQL调优专题——底层调优

引入 上一篇我们提到了调优的常见切入点,核心就是通过数据产出情况发现问题,借助监控等手段收集信息排查瓶颈在哪,最后结合业务理解,等价重写思路去解决问题。 在实际工作场景中,去保证数据链路产出SLA的时候&#x…

Hue 编译异常:ImportError: cannot import name ‘six‘ from ‘urllib3.packages‘

个人博客地址:Hue 编译异常:ImportError: cannot import name six from urllib3.packages | 一张假钞的真实世界 在编译Hue的时候出现错误信息如下: Running /home/zhangjc/ysten/git/ysten-hue/build/env/bin/hue makemigrations --noinpu…

计算机网络——详解TCP三握四挥

文章目录 前言一、三次握手1.1 三次握手流程1.2 tcp为什么需要三次握手建立连接? 二、四次挥手2.1 四次挥手流程2.2 为什么是四次,不是三次?2.3 为什么要等待2msl?2.4 TCP的保活计时器 前言 TCP和UDP是计算机网络结构中运输层的两…

# C# 中堆(Heap)与栈(Stack)的区别

在 C# 中,堆和栈是两种不同的内存分配机制,它们在存储位置、生命周期、性能和用途上存在显著差异。理解堆和栈的区别对于优化代码性能和内存管理至关重要。 1. 栈(Stack) 1.1 定义 栈是一种后进先出(LIFO&#xff0…

如何把图片或者图片地址存到 MySQL 数据库中以及如何将这些图片数据通过 JSP 显示在网页中

如何优雅地管理图片:从MySQL数据库存储到JSP展示的全流程解析 在互联网时代,一张引人入胜的图片往往能为网站带来巨大的流量。而作为开发者的我们,如何高效地管理和展示这些图片资源则成为了一项重要的技术挑战。今天,我们就一起…

「拼好帧」小黄鸭 Lossless Scaling 软件介绍与下载

「拼好帧」小黄鸭 Lossless Scaling 软件介绍与下载 在游戏和视频播放时,你是否遇到过分辨率不匹配、画质模糊的问题?今天给大家介绍一款神器——Lossless Scaling(拼好帧),也被玩家们亲切地称为“小黄鸭”&#xff0…

科普|无人机专业术语

文章目录 前言一、飞控二、电调三、通道四、2S、3S、4S电池五、电池后面C是什么意思?六、电机的型号七、什么是电机的KV值?八、螺旋桨的型号九、电机与螺旋桨的搭配 前言 无人机飞控系统控制飞行姿态,电调控制电机转速,遥控器通道控制飞行动作。电池C…

和鲸科技携手四川气象,以 AI 的力量赋能四川气象一体化平台建设

气象领域与农业、能源、交通、环境科学等国计民生关键领域紧密相连,发挥着不可替代的重要作用。人工智能技术的迅猛发展,为气象领域突破困境带来了新的契机。AI 技术能够深度挖掘气象大数据中蕴含的复杂信息,助力人类更精准地把握自然规律&am…

Linux mount命令

Linux mount命令是经常会使用到的命令,它用于挂载Linux系统外的文件。 一、挂载功能介绍 挂载方法:mount DECE MOUNT_POINT 命令使用格式:mount [-fnrsvw] [-t vfstype] [-o options] device dir device:指明要挂载的设备&…

《Operating System Concepts》阅读笔记:p177-p178

《Operating System Concepts》学习第 18 天,p177-p178 总结,总计 2 页。 一、技术总结 1.implicit thread A programming model that transfers the creation and management of threading from application developers to compilers and run-time l…

Redis缓存一致性难题:如何让数据库和缓存不“打架”?

标题:Redis缓存一致性难题:如何让数据库和缓存不“打架”?(附程序员脱发指南) 导言:当数据库和缓存成了“异地恋” 想象一下:你刚在美团下单了一份麻辣小龙虾,付款后刷新页面&#…

委托者模式(掌握设计模式的核心之一)

目录 问题: 举例: 总结:核心就是利用Java中的多态来完成注入。 问题: 今天刷面经,刷到装饰者模式,又进阶的发现委托者模式,发现还是不理解,特此记录。 举例: ​老板​…