ElasticSearch--倒排索引

2024-09-04 22:36
文章标签 elasticsearch 索引 倒排

本文主要是介绍ElasticSearch--倒排索引,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.ElasticSearch介绍     

        Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基 于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布, 是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速, 安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他 语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是 Apache Solr,也是基于Lucene

演示:京东,淘宝

Lucene是一个Java语言的搜索引擎类库,是Apache公司的顶级项目,由DougCutting于1999年研发。

官网地址: https:// lucene.apache.org/

2.倒排索引 

        倒排索引主要是一种用于全文搜索的数据结构,它将文档中的每个单词映射到包含该单词的所有文档的列表中,然后用该列表替换单词。因此,倒排索引在文本搜索和信息检索中广泛应用,如搜索引擎、网站搜索、文本分类等场景中。

        一个倒排索引包含一个词语词典和每个词语对应的倒排列表。倒排列表中记录了包含该词语的所有文档的编号、词频等信息。能让我们能够在O(1)的时间内判断某个文档是否包含某个词,而且还可以基于词频、相关度等统计信息进行搜索结果排序。

举例说明:

        当我们输入一个关键字“搜索引擎”时,搜索引擎会在倒排索引中查找包含“搜索引擎”这个词语的文档列表,搜索是1,引擎是2,然后返回1,2的文档给用户。这种方式比全文检索要快很多,因为倒排索引搜索的是单个词语,而不是整个文档。

2.1倒排索引中非常重要的概念

词条(term):索引里面最小的存储和查询单元,对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。
词汇表(Vocabulary) :这是一个包含所有不重复词汇的列表,每个词汇都有一个唯一的词汇ID。
倒排列表(Inverted List) :对于每个词汇,倒排列表记录了包含该词汇的文档ID或文档的位置信息。这使得搜索引擎可以快速地找到包含特定词汇的文档。
文档( Document ):用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息

2.2倒排索引原理

倒排索引是一种反向索引结构,它将文档中的每个词汇映射到它出现的文档或文档的位置。它包括两个主要部分:

  • 词汇表(Vocabulary) :这是一个包含所有不重复词汇的列表,每个词汇都有一个唯一的词汇ID。
  • 倒排列表(Inverted List) :对于每个词汇,倒排列表记录了包含该词汇的文档ID或文档的位置信息。这使得搜索引擎可以快速地找到包含特定词汇的文档。
2.3正排索引与倒排索引


正排索引:传统数据库中的索引方式,根据主键或关键字进行排序,适用于精确查找。例如,图书馆的图书按照书号排序,便于查找特定图书。

倒排索引:根据内容中的单词或短语进行排序,适用于全文检索。倒排索引将文档中的单词与文档ID建立关联,便于快速查找包含特定单词的文档。

2. 4倒排索引的构建过程


(1)分词:将文档内容拆分成单词或短语,去除停用词(如“的”、“和”等)。

(2)建立单词词典:将分词后的单词进行排序,去重,形成单词词典。

(3)倒排列表:为每个单词建立倒排列表,记录包含该单词的文档ID及单词在文档中的位置。

(4)索引压缩:对倒排列表进行压缩,减少存储空间。

2.5 检索过程

(1)用户输入一个词语,系统首先对查询进行预处理,包括分词、词干提取等,以便与倒排索引中的词项进行匹配。
(2)系统根据预处理后的查询词项,在倒排索引中查找每个词项对应的文档列表。
(3)如果查询中有多个词项,系统将合并这些词项的倒排列表,找出它们的交集或并集,得到包含所有查询词项的文档集合。
(4)根据每个文档在倒排列表中的相关性得分(如文档频率、位置信息等),对搜索结果进行排序。

2.6 倒排索引的优势和特点
  • 高效的文本搜索:由于倒排索引通过单词快速定位到含有该单词的文档,所以搜索效率非常高。与传统的全文搜索方式相比,倒排索引不需要对每个文档进行扫描,因此可以在大型数据集上快速进行搜索。
  • 支持高级搜索功能:倒排索引可以使用词间关系、词条权重等信息对搜索结果进行精确匹配、布尔运算和相关度排序。
  • 灵活的扩展性:倒排索引支持横向扩展,可以水平分割和复制数据,这样可以轻松地扩大索引容量和提高搜索效率。
  • 支持分词:分词可以将连续字母或数字序列划分为有意义的词组或单个词汇

综上所述,倒排索引是搜索引擎和信息检索领域重要的技术和数据结构,在实现高效、灵活、可扩展和丰富的搜索功能方面有着不可替代的作用。

2.7 倒排索引与正排索引的区别

        正排索引是按照文档编号或文档ID等有序的方式将每个文档存储在索引中,通过文档编号或ID进行检索。这种方式类似于数据库表的行,可以很方便地根据文档ID检索到具体的文档,但是不适合处理大规模文档库的情况。
        倒排索引是按照单词或关键字将文档进行索引,并记录包含该词汇的文档列表。这种方式类似于数据库表的列,可以将具有相同属性的文档按照关键词进行分类,从而实现更加高效和精确的文本搜索。

2.8 倒排索引的应用场景

搜索引擎:如百度、谷歌等,倒排索引是实现快速、准确检索的关键技术。
文本挖掘:在文本挖掘、自然语言处理等领域,倒排索引有助于快速查找相关文档。
数据库:部分数据库系统(如Elasticsearch)采用倒排索引进行全文检索。
 

在实际应用中,正排索引和倒排索引往往是结合使用的。例如,在数据库系统中,正排索引用于快速访问数据记录,而倒排索引用于实现高效的文本搜索。在搜索引擎中,倒排索引用于处理用户的搜索查询,快速返回相关结果,而正排索引则用于获取结果中文档的详细信息。

总结来说,正排索引和倒排索引各有特点,它们在不同的场景下发挥着重要的作用。正排索引适合于基于唯一标识符的数据检索,而倒排索引则更适合于全文搜索和关键词检索。

2.9 mysql与elasticsearch

是不是说,我们学习了elasticsearch就不再需要mysql了呢?

并不是如此,两者各自有自己的擅长支出:

  • Mysql:擅长事务类型操作,可以确保数据的安全和一致性
  • Elasticsearch:擅长海量数据的搜索、分析、计算

因此在企业中,往往是两者结合使用:

  • 对安全性要求较高的写操作,使用mysql实现
  • 对查询性能要求较高的搜索需求,使用elasticsearch实现
  • 两者再基于某种方式,实现数据的同步,保证一致性 

这篇关于ElasticSearch--倒排索引的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1137227

相关文章

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

MySQL 添加索引5种方式示例详解(实用sql代码)

《MySQL添加索引5种方式示例详解(实用sql代码)》在MySQL数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中,下面给大家分享MySQL添加索引5种方式示例详解(实用sql代码),... 在mysql数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中。索引可以在创建表时定义,也可

MySQL索引失效问题及解决方案

《MySQL索引失效问题及解决方案》:本文主要介绍MySQL索引失效问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql索引失效一、概要二、常见的导致MpythonySQL索引失效的原因三、如何诊断MySQL索引失效四、如何解决MySQL索引失

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J