首页 > 其他分享 >深入理解 Elasticsearch 中的倒排索引与倒排列表

深入理解 Elasticsearch 中的倒排索引与倒排列表

时间:2023-08-17 23:32:36浏览次数:36  
标签:倒排 关键词 索引 搜索 文档 Elasticsearch

在现代的后端开发中,搜索引擎已经成为了许多应用不可或缺的一部分。Elasticsearch 作为一款强大的搜索引擎和分布式数据存储系统,其背后所使用的核心技术之一就是倒排索引(Inverted Index)。本文将深入探讨倒排索引的原理,以及在 Elasticsearch 中如何利用倒排索引进行高效的全文搜索。

什么是倒排索引?

倒排索引是一种用于快速定位文档内容的数据结构,它与传统的正排索引(Forward Index)相反,正排索引是根据文档来构建关键词的索引,而倒排索引则是根据关键词来构建文档的索引。在倒排索引中,每个关键词都对应着一个倒排列表(Inverted List),其中记录了包含该关键词的文档在哪些位置出现。这种方式使得搜索引擎可以快速地根据关键词定位到包含该关键词的文档,从而实现高效的文本搜索。

倒排列表的结构

倒排列表是倒排索引的核心组成部分,它记录了每个关键词出现的位置信息,以支持精确的搜索。下面是一个简化的倒排列表示例:

关键词: "技术"
文档ID: 101
位置: [15, 32, 78, 102, ...]

关键词: "深入"
文档ID: 102
位置: [5, 28, 45, 88, ...]

每个关键词对应一个文档ID列表和位置信息,这些位置信息指示了关键词在文档中的具体位置。倒排列表可以使用跳表、压缩编码等技术来优化存储和访问性能,以满足高效的搜索需求。

Elasticsearch 中的倒排索引

Elasticsearch 是一个基于 Lucene 的分布式搜索引擎,它充分利用了倒排索引的优势来实现快速的全文搜索和分析。在 Elasticsearch 中,文档被存储在分片(Shard)中,每个分片都包含了一部分数据和倒排索引。

当你在 Elasticsearch 中创建一个索引时,它会为每个字段构建相应的倒排索引。这使得 Elasticsearch 能够高效地处理各种类型的查询,包括匹配、范围查询、聚合等。

倒排索引的搜索过程

现在让我们来深入了解 Elasticsearch 中的倒排索引是如何支持搜索的。假设我们有一个包含技术文章的索引,我们想要搜索包含关键词 "分布式系统" 的文档。

  1. 分词器(Tokenizer): 当你提交一个搜索请求时,Elasticsearch 首先会将查询文本进行分词处理。分词器会将查询文本拆分成一个个的词项(Terms),例如 "分布式" 和 "系统"。
  2. 倒排索引匹配: Elasticsearch 根据分词后的词项,在倒排索引中查找包含这些词项的倒排列表。
  3. 倒排列表合并: 如果查询涉及多个词项,Elasticsearch 会将这些词项对应的倒排列表进行合并,以获得包含所有查询词项的文档ID。
  4. 评分与排序: 检索到的文档会根据匹配度进行评分,Elasticsearch 使用 TF-IDF(词频-逆文档频率)等算法来计算文档的重要性,并将结果按照评分进行排序。

示例:使用 Elasticsearch 进行全文搜索

现在,让我们通过一个简单的 Java 代码示例来演示如何使用 Elasticsearch 进行全文搜索:

import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchHits;

// 初始化 Elasticsearch 客户端
RestHighLevelClient client = new RestHighLevelClient();

// 构建查询
QueryBuilder query = QueryBuilders.matchQuery("content", "分布式系统");

// 构建搜索请求
SearchRequest searchRequest = new SearchRequest("articles");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(query);
searchRequest.source(sourceBuilder);

// 执行搜索
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = response.getHits();

// 处理搜索结果
for (SearchHit hit : hits) {
    System.out.println("文档ID:" + hit.getId());
    System.out.println("评分:" + hit.getScore());
    // 其他处理逻辑...
}

// 关闭客户端连接
client.close();

在这个示例中,我们使用了 Elasticsearch 的 Java 客户端库来构建搜索请求并执行搜索。我们通过构建查询来指定搜索条件,然后从搜索结果中获取文档ID和评分等信息。

总结

倒排索引是现代搜索引擎背后的核心技术之一,它通过倒排列表的方式支持高效的全文搜索。Elasticsearch 作为一款分布式搜索引擎,充分利用了倒排索引的优势,为开发者提供了强大的全文搜索和分析功能。通过深入理解倒排索引的原理和搜索过程,我们可以更好地应用 Elasticsearch 来构建高性能的后端系统。

希望本文能够帮助你更深入地理解 Elasticsearch 中的倒排索引与倒排列表,以及如何利用这些技术来支持强大的全文搜索功能。如果你对于倒排索引和 Elasticsearch 还有更多疑问,欢迎继续探索和学习,为你的后端开发项目带来更多可能性!

标签:倒排,关键词,索引,搜索,文档,Elasticsearch
From: https://blog.51cto.com/u_15414882/7128723

相关文章

  • MySQL-进阶篇 ( 存储引擎 + 索引一:结构 + 分类 + 语法 + SQL 性能分析 )
    MySQL-进阶篇(存储引擎+索引一)目录MySQL-进阶篇(存储引擎+索引一)存储引擎MySQL体系结构存储引擎简介存储引擎特点InnoDBMyISAMMemory引擎特点区分存储引擎选择索引索引概述索引结构二叉树B-Tree(B树,多路平衡查找树)B+Tree(B加树)Hash面试思考题索引分类在In......
  • 如何在已创建的 es 索引中增加分片
    在Elasticsearch中,分片的数量在创建索引时就已经设置好了,所以在已经创建的索引中增加分片是不可能的。这是因为Elasticsearch在创建索引时,会根据分片的数量把数据分布到不同的节点上,如果在创建索引后改变分片的数量,那么数据的分布就会出问题,这是Elasticsearch设计上的一个决......
  • spring boot 集成 Elasticsearch
    一、背景最近在做录制回放平台,因为需要把部分数据存储到ES,因此特地实践和调研了一把,把相关材料记录一下;elastcishearch版本:7.14.2   springboot版本:2.6.13   spring-boot-starter-data-elasticsearch:2.6.13  版本参考文档 https://docs.spring.......
  • 索引下推
    索引下推是索引下推是MySQL5.6及以上版本上推出的,用于对查询进行优化。索引下推是把本应该在server层进行筛选的条件,下推到存储引擎层来进行筛选判断,这样能有效减少回表。举例说明:首先使用联合索引(name,age),现在有这样一个查询语句:select*fromt_userwherenamelike......
  • 搜文本搜位置搜图片,1小时玩转Elasticsearch
    加入Elasticsearch训练营,从全文检索到向量检索,搭建高频业务场景,构建进阶向量检索应用。带你拓展技术视野,晋升Elasticsearch搜索实战派。以下为训练营的参营指南,请您仔细阅读便于更顺利地进行训练营打卡。活动地址活动地址:<https://developer.aliyun.com/trainingcamp/53a2ca29e......
  • 为什么 MySQL 选择 B+树做索引?
    提到MySQL索引,相信使用过的小伙伴并不陌生,日常工作中,我们经常会加索引来提升查询效率,那么,为什么一个慢查询加上索引查询速度就能提升一个档次?索引后面的实现机制到底是什么?今天就让我们一起来探讨这个话题。申明:本文说的磁盘是指普通的机械磁盘一、索引是什么比如阅读时,索引......
  • elasticsearch中的数据类型search_as_you_type及查看底层Lucene索引
    search_as_you_type字段类型用于自动补全,当用户输入搜索关键词的时候,还没输完就可以提示用户相关内容。as_you_type应该是说当你打字的时候。它会给索引里的这个类型的字段添加一些子字段_2gram_3gram和_index_prefix。_2gram的意思是,如果一个值是abcd,2gram就是abbccd,3gr......
  • numpy中的索引下标为None的各种情况
    REFhttps://zhuanlan.zhihu.com/p/486373530?utm_id=0 None实际上是增加了一个维度,它不是原维度的索引。以一维为例x=np.arange(3)#array([0,1,2])(注意,这个一维数组的shape是(3,),而不是(1,3),初学者很容易犯错。)如果想把x的shape变成(1,3),只需要把None放在第一个......
  • MySQL---索引优化与查询优化(子查询优化)
    索引优化与查询优化子查询优化示例:优化后排序优化注意:1、orderby且不使用limit且数据量比较大时,如果select内容和索引字段不匹配,将会进行回表,优化器将不会使用索引,索引失效;......
  • 逻辑删除与唯一索引冲突的问题
    逻辑删除字段原设计是0表示未删除1表示已删除下面举例说明存在的问题和解决方案一个班的学生学号必须保持唯一,因此建立了唯一索引。如果删除了李明的信息之后,再录入李明的数据库无法插入成功。为了支持逻辑删除,将学号字段和逻辑删除字段建立联合索引但是如果是第二次再......