首页 > 其他分享 >ElasticSearch倒排索引

ElasticSearch倒排索引

时间:2024-09-28 15:50:24浏览次数:12  
标签:搜索 词条 倒排 索引 文档 ElasticSearch id

一、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/

重要特性:

1、分布式的实时文件存储,每个字段都被索引并可被搜索

2、实时分析的分布式搜索引擎

3、可以扩展到上百台服务器,处理PB级结构化或非结构化数据

二、倒排索引

1.正向索引概念

如果是根据id查询,那么直接走索引,查询速度非常快。

但如果是基于title做模糊查询,只能是逐行扫描数据,流程如下:

  1. 用户搜索数据,条件是title符合"%手机%"
  2. 逐行获取数据,比如id为1的数据
  3. 判断数据中的title是否符合用户搜索条件
  4. 如果符合则放入结果集,不符合则丢弃。回到步骤1

逐行扫描,也就是全表扫描,随着数据量增加,其查询效率也会越来越低。当数据量达到数百万时,就 是一场灾难。

2.倒排索引概念

倒排索引(Inverted index) 是一种将词项映射到文档的数据结构,这与传统关系型数据库的工作方式不同。(倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index))

倒排索引中有两个非常重要的概念:

  • 文档( Document ):用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商 品信息
  • 词条( Term ):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词 条。例如:我是中国人,就可以分为:我、是、中国人、中国、国人这样的几个词条

在Elasticsearch(ES)中,倒排索引的结构包括以下几个关键组件:

1. Term Dictionary(词条字典):词条字典是倒排索引的核心部分,它记录了所有出现过的不重复词条。每个词条都有一个唯一的编号(termID)和相应的词频等信息。

2. Posting List(倒排列表):倒排列表是与每个词条相关联的数据结构。它包含了所有包含该词条的文档的信息,如文档ID、词频、位置等。倒排列表中的每个项称为一个倒排项(posting),一个倒排列表包含了所有相关文档的倒排项。

3. Document ID(文档ID):文档ID是一个唯一标识符,用于标识文档在倒排索引中的位置。文档ID可以是自动生成的数字、唯一的字符串或其他类型的标识符。

4. Term Positions(词条位置):倒排索引还可以记录每个词条在文档中的位置信息,即词条在文档中的偏移量。这样可以支持短语查询和位置相关的搜索。

5. Term Frequencies(词条频率):倒排索引可以记录每个词条在文档中出现的频率。这对于搜索结果的排序和评分非常重要。

倒排索引结构的设计使得Elasticsearch能够高效地进行全文搜索和复杂查询。通过将文档中的词条反向映射到文档,倒排索引可以快速定位到包含特定词条的文档,从而提供高效的搜索功能。通过倒排列表和相关的文档ID、词频等信息,ES可以快速计算出搜索结果的相关性,并返回排名合适的文档。这种倒排索引结构的优势使得ES成为一种强大和高效的搜索引擎工具。

创建倒排索引是对正向索引的一种特殊处理,流程如下:

  • 将每一个文档的数据利用算法分词,得到一个个词条
  • 创建表,每行数据包括词条、词条所在文档id、位置等信息
  • 因为词条唯一性,可以给词条创建索引,例如hash表结构索引

如图:

倒排索引的搜索流程如下(以搜索"华为手机"为例):

1)用户输入条件 "华为手机" 进行搜索。

2)对用户输入内容分词,得到词条: 华为 、 手机 。

3)拿着词条在倒排索引中查找,可以得到包含词条的文档id:1、2、3。

4)拿着文档id到正向索引中查找具体文档。

如图:

虽然要先查询倒排索引,再查询倒排索引,但是无论是词条、还是文档id都建立了索引,查询速度非常 快!无需全表扫描。

3.正向索引和倒排索引优缺点

  • 正向索引是最传统的,根据id索引的方式。但根据词条查询时,必须先逐条获取每个文档,然后判 断文档中是否包含所需要的词条,是根据文档找词条的过程。
  • 倒排索引则相反,是先找到用户要搜索的词条,根据词条得到保护词条的文档的id,然后根据id 获取文档。是根据词条找文档的过程。

正向索引:

  • 优点:
    • 可以给多个字段创建索引
    • 根据索引字段搜索、排序速度非常快
  • 缺点:
    • 根据非索引字段,或者索引字段中的部分词条查找时,只能全表扫描。

根据非索引字段,或者索引字段中的部分词条查找时,只能全表扫描。

倒排索引:

  • 优点:
    • 根据词条搜索、模糊搜索时,速度非常快
  • 缺点:
    • 只能给词条创建索引,而不是字段
    • 无法根据字段做排序

标签:搜索,词条,倒排,索引,文档,ElasticSearch,id
From: https://blog.csdn.net/weixin_58693169/article/details/142594191

相关文章

  • Rust索引String
    Rust的String里其实是UTF-8编码的,而UTF-8是变长编码,因此会导致Rust索引String时,可能是索引第k个UTF-8字符(需要遍历字符串),也可能是索引第k个字节。因此,Rust不支持直接用下标来索引String。如果要找到第k个UTF-8字符:s.chars().nth(k)如果要找到第k个字节:letx:u8=s.as_bytes......
  • GaussDB云数据库SQL应用系列—索引管理
    一、前言随着互联网的快速发展,数据量呈现爆炸式增长。如何高效地管理和查询这些数据成为了企业面临的重要问题。而数据库索引作为数据库优化的关键手段之一,对于提高数据库性能和查询效率具有重要作用。本文将介绍GaussDB云数据库的索引创建和管理方法,并结合实际应用场景进行分析......
  • GaussDB SQL调优:建立合适的索引
    ​背景GaussDB是华为公司倾力打造的自研企业级分布式关系型数据库,该产品具备企业级复杂事务混合负载能力,同时支持优异的分布式事务,同城跨AZ部署,数据0丢失,支持1000+扩展能力,PB级海量存储等企业级数据库特性。拥有云上高可用,高可靠,高安全,弹性伸缩,一键部署,快速备份恢复,监控告警等关......
  • thinkphp项目中集成使用 Elasticsearch
    文章目录前言1.安装Elasticsearch2.安装ElasticsearchPHP客户端3.配置Elasticsearch连接4.使用Elasticsearch5.注意事项总结前言在ThinkPHP项目中集成使用Elasticsearch,你需要遵循几个步骤来确保Elasticsearch能够顺利地在你的项目中运行。以下是一个......
  • DataFrame索引与列名操作
    DataFrame索引与列名操作学习目标知道如何查看索引及列名知道如何修改索引及列名1数据准备我们继续使用链家租房数据来学习本章节的API,导包并读取数据importpandasaspd#加载数据集df=pd.read_csv('../data/LJdata.csv')#获取天通苑租房区域的所有数据,......
  • MongoDB TTL索引的使用
    在实际开发中,不少Java开发者会将日志类的debug信息存储到MongoDB中,以便在问题发生时进行排查。然而,这些过期的冗余数据长期占用磁盘空间,给系统带来了不小的负担。如何有效地清理这些垃圾数据呢?MongoDB的TTL索引提供了一个优雅的解决方案。TTL索引是一种特殊的单字段索引,它通过监控......
  • centos7安装elasticsearch6.3.x集群
    一、环境信息及安装前准备主机角色(内存不要小于1G): 软件及版本(百度网盘链接地址和密码:链接:https://pan.baidu.com/s/17bYc8MRw54GWCQCXR6pKjg提取码:f6w8)  部署前操作:关闭防火墙,关闭selinux(生产环境按需关闭或打开)同步服务器时间,选择公网ntpd服务器或者自建ntpd服务器......
  • ELK中日志数据采集器Filebeat的安装和使用、Filebeat结合Logstash进行日志处理入Elast
    一、ELK中日志数据采集器Filebeat的安装和使用    Beats是数据采集的得力工具,Beats能够将数据转发至Logstash进行转换和解析。Filebeat是Beats中的一种,Filebeat是本地文件的日志数据采集器,可监控日志目录或特定日志文件(tailfile),并将它们转发给Elasticsearch或Logstats......
  • mysql的索引
    InnoDB是mysql的默认引擎,索引原理是B+树。InnoDB的索引方式首先,数据库的目录也是很庞大的,不能放在内存里。而磁盘的读写速度是比内存慢几个数量级。而且顺序读一块比随机I/O划算,也就是局部性原理。所以:InnoDB把数据和目录都放在默认大小16KB的数据页中。每次读都读一个页......
  • Elasticsearch基本概念及底层 【总结】
    随着业务的增长,数据与日俱增,这时为用户带来丰富的、便捷的搜索功能就迫在眉睫了。传统的数据库在处理文本搜索、模糊查询、海量数据统计分析的时候总会力不从心,所以在处理这些复杂的搜索需求时,我们更倾向于使用Elasticsearch搜索引擎。Elasticsearch是一个分布式、RESTf......