【Elasticsearch】Elasticsearch倒排索引详解

news2025/4/4 4:34:40

文章目录

  • 📑引言
  • 一、倒排索引简介
  • 二、倒排索引的基本结构
  • 三、Elasticsearch中的倒排索引
    • 3.1 索引和文档
    • 3.2 创建倒排索引
    • 3.3 倒排索引的存储结构
    • 3.4 词典和倒排列表的优化
  • 四、倒排索引的查询过程
    • 4.1 过程
    • 4.2 示例
  • 五、倒排索引的优缺点
    • 5.1 优点
    • 5.2 缺点
  • 六、倒排索引在实际应用中的优化
    • 6.1 分析器配置
    • 6.2 分片和副本
    • 6.3 缓存机制
    • 6.4 数据分层存储

📑引言

Elasticsearch是一个基于Lucene的分布式搜索引擎,广泛应用于全文搜索、日志分析和实时数据分析等领域。其核心优势在于其强大的搜索性能,而这种性能的基础之一就是倒排索引(Inverted Index)。本文将详细介绍Elasticsearch中的倒排索引,帮助读者深入理解其原理、结构及应用。

image.png

一、倒排索引简介

倒排索引是全文搜索引擎的核心数据结构,其主要作用是从文档中提取关键词,并建立关键词到文档的映射关系。这种结构与传统的正排索引(即文档到关键词的映射)相反,因此称为倒排索引。
在倒排索引中,每个关键词都关联着包含该关键词的文档列表,这使得搜索操作能够迅速定位包含特定关键词的文档,从而大幅提高查询效率。

二、倒排索引的基本结构

倒排索引的基本结构包括以下几个部分:

  1. 词典(Dictionary):包含所有在文档集中出现的关键词。
  2. 倒排列表(Inverted List):对于每个关键词,记录包含该关键词的文档ID列表及其在文档中的位置信息。

举一个简单的例子:
假设我们有以下三个文档:

  • 文档1:"Elasticsearch is a powerful search engine"
  • 文档2:"Elasticsearch uses inverted index"
  • 文档3:"Search engines use indexes"

构建倒排索引的步骤如下:

  1. 词条化(Tokenization):将文档拆分为单词,并进行规范化处理(如转小写、去除停用词等)。
  2. 建立词典:提取所有文档中的唯一单词。
  3. 创建倒排列表:记录每个单词在各个文档中的出现位置。

结果如下:

  • elasticsearch -> {1, 2}
  • is -> {1}
  • a -> {1}
  • powerful -> {1}
  • search -> {1, 3}
  • engine -> {1}
  • uses -> {2}
  • inverted -> {2}
  • index -> {2}
  • engines -> {3}
  • use -> {3}
  • indexes -> {3}

三、Elasticsearch中的倒排索引

3.1 索引和文档

在Elasticsearch中,数据以索引(Index)的形式存储,每个索引包含多个文档(Document)。每个文档是一个JSON对象,包含多个字段(Field),每个字段都有相应的值。

3.2 创建倒排索引

当一个文档被索引时,Elasticsearch会对文档进行分析(Analyze),将其分解为多个词条(Term)。分析过程包括分词(Tokenization)、词干提取(Stemming)和去除停用词(Stop Word Removal)等步骤。处理后的词条将被添加到倒排索引中。

3.3 倒排索引的存储结构

Elasticsearch基于Apache Lucene构建,Lucene使用了一种高效的倒排索引存储结构。每个索引由多个分片(Shard)组成,每个分片是一个Lucene索引。在每个Lucene索引中,倒排索引以段(Segment)形式存储。段是不可变的文件集合,当有新的文档添加时,Lucene会创建新的段,并定期进行段合并(Segment Merging)以减少文件数量和提高查询性能。

3.4 词典和倒排列表的优化

为了提高查询效率,Lucene对词典和倒排列表进行了多种优化:

  1. 跳表(Skip List):在倒排列表中引入跳表结构,允许快速跳转到指定位置,加速查询速度。
  2. 前缀压缩(Prefix Compression):对词典中的相邻词条进行前缀压缩,减少存储空间。
  3. 块索引(Block Indexing):将倒排列表分成固定大小的块,每个块包含多个文档ID。查询时,可以快速定位到包含目标文档ID的块,从而减少遍历的时间。

四、倒排索引的查询过程

4.1 过程

当用户发起搜索请求时,Elasticsearch会根据查询条件在倒排索引中查找匹配的文档。以关键词查询为例,查询过程如下:

  1. 解析查询:将用户输入的查询字符串解析为关键词列表。
  2. 查找词典:在倒排索引的词典中查找每个关键词,获取对应的倒排列表。
  3. 合并结果:根据倒排列表合并结果,生成匹配文档的列表。
  4. 计算评分:对匹配的文档进行相关性评分,排序后返回给用户。

4.2 示例

假设我们要搜索关键词"Elasticsearch search engine",查询过程如下:

  1. 解析查询:["elasticsearch", "search", "engine"]
  2. 查找词典:
    • elasticsearch -> {1, 2}
    • search -> {1, 3}
    • engine -> {1}
  3. 合并结果:文档1包含所有关键词,文档2和文档3分别包含部分关键词。
  4. 计算评分:根据文档与查询的匹配度进行评分,假设文档1得分最高,则返回文档1。

五、倒排索引的优缺点

5.1 优点

  1. 高效的关键词搜索:倒排索引允许快速查找包含特定关键词的文档,极大提高了查询效率。
  2. 可扩展性:通过分片和副本机制,Elasticsearch能够处理大规模数据,并保证高可用性。
  3. 灵活的查询能力:支持多种查询类型,如布尔查询、范围查询、模糊查询等,满足不同应用需求。

5.2 缺点

  1. 存储空间占用较大:倒排索引需要存储词典和倒排列表,可能占用较多存储空间,尤其是处理大规模文本数据时。
  2. 实时性较弱:由于倒排索引的构建和更新需要一定时间,可能无法满足高实时性要求的应用场景。

六、倒排索引在实际应用中的优化

6.1 分析器配置

Elasticsearch提供多种内置分析器,如标准分析器(Standard Analyzer)、简洁分析器(Simple Analyzer)等。用户可以根据实际需求选择合适的分析器,并进行定制化配置,如添加同义词过滤器(Synonym Filter)等。

6.2 分片和副本

通过合理配置分片(Shard)和副本(Replica)数量,可以提高Elasticsearch集群的查询性能和容错能力。分片允许将数据分布到多个节点上,副本提供数据冗余以应对节点故障。

6.3 缓存机制

Elasticsearch支持多种缓存机制,如查询缓存(Query Cache)、过滤器缓存(Filter Cache)等。合理利用缓存可以减少磁盘I/O,提高查询性能。

6.4 数据分层存储

对于大规模数据,可以采用冷热分离存储策略,将近期活跃数据存储在高性能存储介质上,将历史数据存储在低成本存储介质上,降低存储成本的同时保证查询性能。
封面.png

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

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

相关文章

阶段三:项目开发---搭建项目前后端系统基础架构:任务9:导入空管基础数据

任务描述 本阶段任务是导入项目的基础数据,包括空管基础数据和离线的实时飞行数据(已经脱敏)。 任务指导 本阶段任务需要导入两种数据: 1、在MySQL中导入空管基础数据 kongguan.sql空管基础数据表说明: 1告警信息…

什么牌子的头戴式蓝牙耳机好性价比高?

说起性价比高的头戴式蓝牙耳机,就不得不提倍思H1s,作为倍思最新推出的新款,在各项功能上都实现了不错的升级,二字开头的价格,配置却毫不含糊, 倍思H1s的音质表现堪称一流。它采用了40mm天然生物纤维振膜,这种振膜柔韧而有弹性,能够显著提升低音的量感。无论是深沉的低音还是清…

C语言 | Leetcode C语言题解之第221题最大正方形

题目&#xff1a; 题解&#xff1a; int maximalSquare(char** matrix, int matrixSize, int* matrixColSize){int dp[301][301]{0};int wid0;if(matrixSize0&&matrixColSize[0]0){return 0;}for(int i0;i<matrixSize;i){for(int j0;j<matrixColSize[0];j){if(m…

linux docker部署(离线.deb)非桌面版

目录 一.查看本机系统 二.下载deb包 三.安装 一.查看本机系统 uname -m二.下载deb包 下载官网&#xff1a;Index of linux/ubuntu/dists/focal/pool/stable/amd64/ (docker.com) 目录说明&#xff1a; 我是ubuntu20.04&#xff0c;选择focal&#xff1a; edge/&#xff…

R语言实战—圆形树状图

话不多说&#xff0c;先看最终效果&#xff1a; 圆形树状图是树状图的一个变型&#xff0c;其实都是层次聚类。 接下来看代码步骤&#xff1a; 首先要先安装两个包&#xff1a; install.packages("ggtree") install.packages("readxl") 咱就别问问什么…

群体优化算法----化学反应优化算法介绍,解决蛋白质-配体对接问题示例

介绍 化学反应优化算法&#xff08;Chemical Reaction Optimization, CRO&#xff09;是一种新兴的基于自然现象的元启发式算法&#xff0c;受化学反应过程中分子碰撞和反应机制的启发而设计。CRO算法模拟了分子在化学反应过程中通过能量转换和分子间相互作用来寻找稳定结构的…

C++ unique_ptr智能指针学习

unique_ptr是一种定义在<memory>中的智能指针(smart pointer)。它持有对对象的独有权——两个unique_ptr不能指向一个对象&#xff0c;不能进行复制操作只能进行移动操作。 如下图&#xff0c;定义p1为unique_ptr类型指针&#xff0c;如果把p1赋给p2&#xff0c;则编译出…

【题解】—— LeetCode一周小结27

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结26 2024.7 1.最大化一张图中的路径价值 题目链接&#xff1a;…

墨烯的C语言技术栈-C语言基础-008

八.转义字符(转变原来字符的意思) 假如我们要在屏幕上打印一个目录:C:\code\test.c 我们应该如何写代码 int main() { printf("abc\n") // \让n转变 换行作用 return 0; } imt main() { printf("abc\0def") // \0后就是结束了后面打不印了 return 0; }…

C语言指针,的声明、取地址、*解引用、设置值、偏移、自增 的问题举例

C语言指针,的声明、&取地址、※解引用、设置值、偏移、自增 的问题举例代码&#xff1a;int※a,d[]{1,2,4,8};char*f,e[]“Hellow…”;a&b; P1※a; ※a4; P1※(a);f&e[7]; &#xff08;备注&#xff1a;※代表*&#xff0c;转义问题&#xff0c;没显示&#xff09…

Spring Cloud: Nacos配置中心与注册中心的使用

一、配置中心(配置管理) 配置中心是一种集中化管理配置的服务。它的主要作用包括集中管理配置信息&#xff0c;将不同服务的配置信息集中存储和管理&#xff1b;支持动态更新配置&#xff0c;通过操作界面或 API 无需重启服务即可应用最新配置信息&#xff1b;实现配置信息共享…

通过AIS实现船舶追踪与照射

前些天突然接到个紧急的项目&#xff1a;某处需要实现对夜航船只进行追踪并用激光灯照射以保障夜航安全。这个项目紧急到什么程度呢&#xff1f;&#xff01;现场激光灯都安装好了&#xff0c;还有三个星期就要验收了&#xff0c;但上家没搞定就甩给我们了:( 从技术上看&#…

【Python】已解决:xml.parsers.expat.ExpatError: no element found: Line 1, column 0

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;xml.parsers.expat.ExpatError: no element found: Line 1, column 0 一、分析问题背景 在使用Python的xml.parsers.expat模块解析XML文件时&#xff0c;有时会…

咬文嚼字:词元是当今生成式人工智能失败的一个重要原因

生成式人工智能模型处理文本的方式与人类不同。了解它们基于"标记"的内部环境可能有助于解释它们的一些奇怪行为和顽固的局限性。从 Gemma 这样的小型设备上模型到 OpenAI 业界领先的 GPT-4o 模型&#xff0c;大多数模型都建立在一种称为转换器的架构上。由于转换器在…

Java中读写文件内容乱码/BufferedReader读文件内容乱码/OutputStreamWriter设置编码集

1、问题概述&#xff1f; 在项目中我们经常会将例如日志信息放入到txt(任意后缀)文档中&#xff0c;然后在项目中通过弹框等形式查看直接的查看这些文档中的信息&#xff0c;然后有时候会出现乱码的情况。 这个时候我们就需要设置写入和写出时候的编码集情况。 2、解决方案 …

【PB案例学习笔记】-29制作一个调用帮助文档的小功能

写在前面 这是PB案例学习笔记系列文章的第29篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

Windows使用nxlog发送系统日志到Linux的rsyslog服务器

Windows使用nxlog发送系统日志到Linux的rsyslog服务器 前言一、IP地址规划及示意图二、在windows上安装及配置nxlog1.下载nxlog2.安装nxlog3.配置nxlog4.创建对应日志路径的文件夹 三、windows上启动nxlog服务四、在CentOS 7上配置日志存到指定位置文件1.编辑/etc/rsyslog.conf…

Python | Leetcode Python题解之第222题完全二叉树的节点个数

题目&#xff1a; 题解&#xff1a; # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def countNodes(self,…

[C++][ProtoBuf][初识ProtoBuf]详细讲解

目录 1.序列化概念2.ProtoBuf是什么&#xff1f;3.ProtoBuf使用特点4.补充1.GOOGLE_PROTOBUF_VERIFY_VERSION 宏2.ShutdownProtobufLibrary()3.--decode 5.序列化能力对比验证6.总结 1.序列化概念 序列化&#xff1a;把对象转换为字节序列的过程&#xff0c;称为对象的序列化反…