【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.2.2倒排索引原理与分词器(Analyzer)

news2025/2/28 5:56:53

👉 点击关注不迷路
👉 点击关注不迷路
👉 点击关注不迷路


文章大纲

  • 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.coloradmin.cn/o/2307228.html

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

相关文章

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

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

linux下java Files.copy 提示文件名过长

linux下java Files.copy 提示文件名过长问题排查 系统运行时执行文件拷贝的功能的时候出现了 文件名称过长的报错提示 查询过资料后整理出了每个操作系统支持最大的文件名称长度 每个操作系统现在的文件长度不一样 Linux的 /usr/include/linux/limits.h 中做出了说明 这些限制…

Metal学习笔记八:纹理

到目前为止,您已经学习了如何使用片段函数和着色器为模型添加颜色和细节。另一种选择是使用图像纹理,您将在本章中学习如何作。更具体地说,您将了解: • UV 坐标:如何展开网格,以便可以对其应用纹理。 • 纹…

Idea 和 Pycharm 快捷键

一、快捷键 二、Pycharm 中怎么切换分支 参考如下 如果在界面右下角 没有看到当前所在的分支,如 “Git:master” 3. 有了 4.

fody引用c++的dll合并后提示找不到

fody引用c的dll合并后提示找不到 解决方案&#xff1a; 在 FodyWeavers.xml 文件中添加配置 CreateTemporaryAssemblies‘true’ 官方文档&#xff1a;https://github.com/Fody/Costura <Weavers xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:noN…

初识flutter1

为什么使用flutter, 说直白一点,就是移动UI框架, 个人认为优势是: 1.一套代码adnroid 和ios 可以使用, 代码好维护 2.原生用户界面 3.开源、免费的 开发工具&#xff1a; 1.下载 java 包, 根据自己的电脑配置选择 官网下载: https://www.oracle.com/java/technologies/download…

12字符函数

一、函数strchr与strrchr 注意&#xff1a; 这两个函数的功能&#xff0c;都是在指定的字符串 s 中&#xff0c;试图找到字符 c。strchr() 从左往右找&#xff0c;strrchr() 从右往左找。字符串结束标记 ‘\0’ 被认为是字符串的一部分。 图解&#xff1a; 示例代码&#xff…

QT6开发高性能企业视频会议-8 使用VSCode+Copilot AI开发

Github Copilot是Github和OpenAI推出的AI编程辅助工具&#xff0c;之前版本的Github Copilot只有简单的代码自动补全&#xff0c;根据注释生成一些代码等辅助功能。 近期Copilot有了一次大的升级&#xff0c;加入了Agent模式&#xff0c;可以实现自然语言对话讨论和最重要的&a…

矩阵的奇异值(SVD)分解和线性变换

矩阵的奇异值&#xff08;SVD&#xff09;分解和线性变换 SVD定义 奇异值分解&#xff08;Singular Value Decomposition&#xff0c;简称 SVD&#xff09;是一种重要的线性代数工具&#xff0c;能够将任意矩阵 ( A ∈ R m n \mathbf{A} \in \mathbb{R}^{m \times n} A∈Rmn…

数据库的sql语句

本篇文章主要用来收集项目开发中&#xff0c;遇到的各种sql语句的编写。 1、根据user表的role_id字段&#xff0c;查询role表。 sql语句&#xff1a;使用JOIN连接两个表 SELECT u.*,r.rolename FROM user u JOIN role r ON u.role_id r.id WHERE u.id 1; 查询结果&#xff1a…

Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调

Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调 环境准备创建Python微调环境准备数据集准备模型文件 模型微调模型预测原始模型预测微调模型预测 使用unsloth&#xff0c;可以方便地对大模型进行微调。以微调DeepSeek-R1-Distill-Llama-8B为…

Bugku CTF Crypto(二)

目录 这不是md5 贝斯家族 把猪困在猪圈里 黄道十二官&#xff08;宫&#xff09; 抄错的字符 这不是md5 描 述: 666c61677b616537333538376261353662616566357d 分 析&#xff1a;题目提示这不是md5&#xff0c;字符中出现了d&#xff0c;猜测16进制 使用…

单片机总结【GPIO/TIM/IIC/SPI/UART】

一、GPIO 1、概念 通用输入输出口&#xff1b;开发者可以根据自己的需求将其配置为输入或输出模式&#xff0c;以实现与外部设备进行数据交互、控制外部设备等功能。简单来说&#xff0c;GPIO 就像是计算机或微控制器与外部世界沟通的 “桥梁”。 2、工作模式 工作模式性质特…

Rt-thread源码剖析(1)——内核对象

前言 该系列基于rtthread-nano的内核源码&#xff0c;来研究RTOS的底层逻辑&#xff0c;本文介绍RTT的内核对象&#xff0c;对于其他RTOS来说也可供参考&#xff0c;万变不离其宗&#xff0c;大家都是互相借鉴&#xff0c;实现不会差太多。 内核对象容器 首先要明确的一点是什…

十一、大数据治理平台总体功能架构

大数据治理平台的功能架构图中心主题&#xff1a;数据治理 核心重点是建立健全大数据资产管理框架&#xff0c;确保数据质量、安全性、可访问性和合规性。 大数据治理平台总体功能架构图 关键功能领域 1.数据资产平台&#xff08;左侧&#xff09; 此部分主要关注数据资产本身…

STM32——HAL库开发笔记23(定时器4—输入捕获)(参考来源:b站铁头山羊)

定时器有四个通道&#xff0c;这些通道既可以用来作为输入&#xff0c;又可以作为输出。做输入的时候&#xff0c;可以使用定时器对外部输入的信号的时间参数进行测量&#xff1b;做输出的时候&#xff0c;可以使用定时器向外输出精确定时的方波信号。 一、输入捕获 的基本原理…

向量数据库milvus部署

官方文档 Milvus vector database documentationRun Milvus in Docker (Linux) | Milvus DocumentationMilvus vector database documentation 按部署比较简单&#xff0c;这里说一下遇到的问题 一&#xff1a;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库是一个不错的选择…

【亲测有效】百度Ueditor富文本编辑器添加插入视频、视频不显示、和插入视频后二次编辑视频标签不显示,显示成img标签,二次保存视频被替换问题,解决方案

【亲测有效】项目使用百度Ueditor富文本编辑器上传视频相关操作问题 1.百度Ueditor富文本编辑器添加插入视频、视频不显示 2.百度Ueditor富文本编辑器插入视频后二次编辑视频标签不显示&#xff0c;在编辑器内显示成img标签&#xff0c;二次保存视频被替换问题 问题1&#xff1…