ElasticSearch搜索引擎入门到精通

ES 是基于 Lucene 的全文检索引擎,它会对数据进行分词后保存索引,擅长管理大量的数据,相对于 MySQL 来说不擅长经常更新数据及关联查询。这篇文章就是为了进一步了解一下它,到底是如何做到这么高效的查询的。

在学习其他数据库的时候我们知道索引是一个数据库系统极其重要的部分,它直接决定着查询的效率。ES之所以快,是因为其底层的Lucene采用倒排索引的方式,并且还有很多的优化点,

倒排索引

何谓倒排索引?

——先看正排索引,如下表:

上图就是一个简单的正排索引。即将doc_id作为主键索引key,去查询到对应的一行数据value。

而倒排索引就有些反其道而行之的概念了。我们先将每句话按照单词分成一个一个的,而后看看对应的doc_id有哪些:

当要查询 包含 li 的数据时,只需要通过这个索引结构查询到 Posting List 中所包含的数据,再通过映射的方式查询到最终的数据

就相当于由value去找出可能的key,再利用key去获取完整的数据。这种索引结构就是所谓的倒排索引。

虽然上面这种方式,可以实现查询数据到Position LIst(理解为行id等都可以)的快速查找,但是,使用什么数据结构来存储Term呢?

Term Index

我们将所有 Term 合并在一起就是一个 Term Dictionary,也可以叫做单词词典。英文的分词相对简单,只需要通过空格、标点符号将文本分隔便能拆词,中文则相对复杂,但也有许多开源工具做支持。

现在要解决一个问题,我们如何保存Term呢?

比如现在有多个Term:

Carla,Sara,Elin,Ada,Patty,Kate,Selena

我们需要从中找出某个特定的Term,只能遍历,那么时间复杂度平均为O(n),这在单词数众多的时候很慢,而如果我们能够按照某种规则将其排序,那么利用二分查找的方式就可以将时间复杂度降到O(logN):

Ada,Carla,Elin,Kate,Patty,Sara,Selena

当我们的文本量巨大时,分词后的 Term 也会很多,这样一个倒排索引的数据结构如果存放于内存那肯定是不够存的,但如果像 MySQL 那样存放于磁盘,去访问磁盘获取数据效率也没那么高

为了尽可能减小磁盘IO的次数,所以我们可以使用一个折中的方式——既然内存中无法放入整个Term Dictionary,那我就为Term Dictionary创建一个索引Term Index,将这个索引放到内存里。

term index 有点像一本字典的大的章节表。比如:

A 开头的 term ……………. Xxx 页

C 开头的 term ……………. Yyy 页

E 开头的 term ……………. Zzz 页

如果所有的 term 都是英文字符的话,可能这个 term index 就真的是 26 个英文字符表构成的了。

但是实际的情况是,term 未必都是英文字符,term 可以是任意的 byte 数组。而且 26 个英文字符也未必是每一个字符都有均等的 term,比如 x 字符开头的 term 可能一个都没有,而 s 开头的 term 又特别多。实际的 term index 是一棵 trie 树:

例子是一个包含 “A”, “to”, “tea”, “ted”, “ten”, “i”, “in”, 和 “inn” 的 trie 树。这棵树不会包含所有的 term,它包含的是 term 的一些前缀。通过 term index 可以快速地定位到 term dictionary 的某个 offset,然后从这个位置再往后顺序查找。再加上一些压缩技术( Finite State Transducers) term index 的尺寸可以只有所有 term 的尺寸的几十分之一,使得用内存缓存整个 term index 变成可能。整体上来说就是这样的效果。

现在我们可以回答“为什么 Elasticsearch/Lucene 检索可以比 mysql 快了”

Mysql 只有 term dictionary 这一层,是以 b-tree 排序的方式存储

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI正式推出GPT商店 ChatGPT团队订阅服务一并推出

2024年1月11日消息,据外媒报道,如上周在给开发者的邮件中所宣布的一样,因ChatGPT而名声大噪的人工智能公司OpenAI,在本周正式推出了GPT商店,供用户分享和发现个性化的ChatGPT,同时他们也推出了面向各种不同…

【Java 数据结构】ArrayList与顺序表

ArrayList 1.线性表2.顺序表2.1 接口的实现 3. ArrayList简介4. ArrayList使用4.1 ArrayList的构造4.2 ArrayList常见操作4.3 ArrayList的遍历4.4 ArrayList的扩容机制 1.线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一…

Java / Spring Boot + POI 给 Word 添加水印

1、前言(瞎扯) 事情是这样子的:我好哥们所在的公司实在是太忙了,多线程都开起来了还是忙不完,只能开了子线程叫我帮他整一个给 Word 加水印的,于是我就网上找呗~ 看到那个 Aspose 好像是收费的,然后就把目光转向了 POI…

基于物联网设计的水稻田智能灌溉系统(STM32+华为云IOT)

一、项目介绍 随着科技的不断发展和人们生活水平的提高,农业生产也逐渐向智能化、高效化的方向发展。水稻作为我国主要的粮食作物之一,其生长过程中的灌溉管理尤为重要。传统的灌溉方式往往依赖于人工观察和控制,不仅效率低下,而…

城市开发区视频系统建设方案:打造视频基座、加强图像数据治理

一、背景需求 随着城市建设的步伐日益加快,开发区已经成为了我国工业化、城镇化和对外开放的重要载体。自贸区、开发区和产业园的管理工作自然也变得至关重要。在城市经开区的展览展示馆、进出口商品展示交易中心等地,数千路监控摄像头遍布各角落&#…

Spring-Kafka 3.0 消费者消费失败处理方案

一、背景 我们作为Kafka在使用Kafka是,必然考虑消息消费失败的重试次数,重试后仍然失败如何处理,要么阻塞,要么丢弃,或者保存 二、设置消费失败重试次数 1 默认重试次数在哪里看 Kafka3.0 版本默认失败重试次数为1…

27.移除元素(力扣LeetCode)

文章目录 27.移除元素(力扣LeetCode)题目描述方法一:vector成员函数:erase方法二:暴力解法方法三:双指针法 27.移除元素(力扣LeetCode) 题目描述 给你一个数组 nums 和一个值 val&…

【开源】基于JAVA语言的班级考勤管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统基础支持模块2.2 班级学生教师支持模块2.3 考勤签到管理2.4 学生请假管理 三、系统设计3.1 功能设计3.1.1 系统基础支持模块3.1.2 班级学生教师档案模块3.1.3 考勤签到管理模块3.1.4 学生请假管理模块 3.2 数据库设…

python Django入门

1.创建Django项目 方式一:进入到指定要存放项目的目录,执行*django-admin startproject “projectname”* 来创建一个名方式二:使用Pycharm专业版创建Django项目 创建项目后,默认的目录结构: manage.py:是Django用于管理本项目的命令行工具&#xff0c…

前出深入-机器学习

文章目录 一、K近邻算法1.1 先画一个散列图1.2 使用K最近算法建模拟合数据1.3 进行预测1.4 K最近邻算法处理多元分类问题1.5 K最近邻算法用于回归分析1.6 K最近邻算法项目实战-酒的分类1.6.1 对数据进行分析1.6.2 生成训练数据集和测试数据集1.6.3 使用K最近邻算法对数据进行建…

如何在Shopee平台上进行选品 :充分利用渠道获取灵感和数据支持

在Shopee平台上进行选品是一个关键的决策过程,它直接影响到卖家的销售业绩和店铺的发展。为了帮助卖家更好地进行选品,Shopee提供了多种渠道来获取灵感和数据支持。下面将介绍一些主要的选品渠道以及如何利用它们来进行选品。 先给大家推荐一款shopee知…

【DDD】学习笔记-深入分析软件的复杂度

软件复杂度的成因 Eric Evans 的经典著作《领域驱动设计》的副标题为“软件核心复杂性应对之道”,这说明了 Eric 对领域驱动设计的定位就是应对软件开发的复杂度。Eric 甚至认为:“领域驱动设计只有应用在大型项目上才能产生最大的收益”。他通过 Smart…

C#,数据检索算法之线性检索(Linear Search)的源代码

数据检索算法是指从数据集合(数组、表、哈希表等)中检索指定的数据项。 数据检索算法是所有算法的基础算法之一。 线性?听起来就“高大上”,其实,只不过就是挨个比较呗。 本文发布(听起来很正式 &#x…

TarGAN:多模态医学图像转换GAN

TarGAN 核心思想网络结构 核心思想 论文:https://arxiv.org/abs/2105.08993 代码:https://github.com/2165998/TarGAN 解决的问题:传统多模态医学图像转换通常,在生成高质量图像方面存在问题,特别是在关键目标区域或…

C语言中计算结构体的大小

一. 使用sizeof 计算结构体的大小 通常情况下,我们习惯于使用 sizeof 运算符来计算结构体的大小。 例如,下面是一个结构体的定义: struct Student {int id;char name[20];int age;float score; }; 其中,Student是该结构体的类…

IP被封怎么办?如何绕过IP禁令?

相信很多人遇到过IP禁令:比如你在访问社交媒体、搜索引擎或电子商务网站时会被限制访问,又或者你的的账号莫名被封,这些由于网络上的种种限制我们经常会遭遇IP被封的情况,导致无法使用继续进行网络行动。在本文中,我们…

Django笔记(七):JWT认证

首 前后端分离的项目更多使用JWT认证——Json Web Token。本文记录djangorestframework-simplejwt的使用方式。文档 安装 pip install djangorestframework-simplejwt 配置settings.py: INSTALLED_APPS [rest_framework_simplejwt, ]REST_FRAMEWORK {DEFAULT_AUTHENTICA…

ARM 400系列控制器IP简介

1. GIC-400 GIC-400是一个高性能、区域优化的中断控制器,具有高级微控制器总线架构(AMBA)高级可扩展接口(AXI)接口。它在片上系统(SoC)配置中检测、管理和分配中断。你可以对GIC-400进行配置&am…

shell脚本基础之循环语句

目录 一、循环语句的概念 二、for循环语句 1、列表循环 2、列表for循环案例大全 案例一 案例二 案例三 案例四 案例五 案例六 案例七 案例八 3、不带列表循环 4、类似C语言风格的for循环 5、for循环总结 三、while循环语句 1、while循环语句格式 2、while死循…

概念性——数据库简介

前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。 概念性——数据库简介 介绍 数据对于当今许多应用程序和网站的运行至关重要。对热门视频的评论、多人游戏中分…