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 排序的方式存储

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

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

相关文章

【基础配置】Python2/Python3并存安装配置教程

Nx01 产品简介 Python是一种高级的、解释型的、面向对象的通用编程语言,具有简单易学、代码可读性强、功能强大、可移植性好等特点。它可以应用于多种领域,如Web开发、数据科学、人工智能、机器学习、科学计算、自动化测试等。Python由Guido van Rossum于…

如何使用phpStudy软件测试本地PHP及环境搭建

各位同学朋友们大家好!我是咕噜铁蛋!我们经常需要在本地进行PHP代码的开发和测试。而phpStudy作为一个集成了Apache、MySQL和PHP的软件套装,提供了方便快捷的环境搭建和测试工具。今天铁蛋为大家详细介绍如何使用phpStudy来测试本地PHP及环境…

gradle源

腾讯源 distributionUrlhttps\://mirrors.cloud.tencent.com/gradle/gradle-xxx-bin.zip阿里云 https://developer.aliyun.com/mvn/guide maven { url http://maven.aliyun.com/nexus/content/groups/public/ }maven { url https://maven.aliyun.com/repository/google }mave…

【cuda】RuntimeError: Unexpected error from cudaGetDeviceCount()

解决 会发现 nvidia-smi 不管用了。不要立即重启,会黑屏的。赶紧记录使用的驱动版本号,最好找到安装包位置。 直接重装原版驱动,环境还能用。 参考我的安装博客。 已经黑屏就进入安全模式,network模式。卸载可视化桌面和显卡驱动…

雨云服务器部署幻兽帕鲁PalWorld联机服务器详细教程

幻兽帕鲁是Pocketpair开发的一款开放世界生存制作游戏,游戏中,玩家可以在广阔的世界中收集神奇的生物“帕鲁”,派他们进行战斗、建造、做农活,工业生产等。 最近,这款游戏挺火,为了获得更好的游戏体验&…

SpringBoot中Redis解决LocalDateTime序列化与反序列化不一致问题

前言 在SpringBoot应用中,数据的序列化和反序列化是关键环节。然而,对于LocalDateTime类型的数据,有时会遇到序列化与反序列化不一致的问题。这主要是由于不同的时区或格式差异所导致。为了解决这一问题,我们可以借助Redis的强大功…

手搓 国内首个非Attention大模型,训练效率7倍于Transformer

手搓 国内首个非Attention大模型,训练效率7倍于Transformer 非Attention大模型代码解析非Attention大模型代码 import torchclass FeedForward(torch.nn.Module):def __init__(self, hidden_dim):super

爬虫工作量由小到大的思维转变---<第四十章 Scrapy Redis 实现IP代理池管理的最佳实践>

前言: 本篇是要结合上篇一起看的姊妹篇:爬虫工作量由小到大的思维转变---<第三十九章 Scrapy-redis 常用的那个RetryMiddleware>-CSDN博客 IP代理池的管理对于确保爬虫的稳定性和数据抓取的匿名性至关重要。围绕Scrapy-Redis框架和一个具体的IP代理池中…

Vue构建项目断点调试过程问题总结

Vue构建项目断点调试过程问题总结 问题背景 前端开发过程中,碰到问题时需要debug,快速分析和解决问题。一般除了console.log的方式打印日志外,更方便直观的方式就是打断点debug。本文对vue项目debug过程可能碰到的问题进行总结,…

“数据同步大揭秘:Canal工具如何让实时处理变得轻而易举?“

介绍:Canal是一个基于MySQL数据库增量日志解析的开源数据同步工具。 Canal的主要功能是提供增量数据订阅和消费,它通过解析MySQL数据库的增量日志来捕获数据变更事件,并将这些事件转换成数据变更流,供用户订阅和消费。这样&#x…

魔法少女LJJ 题解

推荐在 cnblogs 上阅读 魔法少女LJJ 题解 这题纯属就是迷惑题。。 为什么这么说? 注意数据范围: 对 100% 的数据 0 ≤ m ≤ 400000 0\leq m\leq400000 0≤m≤400000, c ≤ 7 c\leq 7 c≤7。 c ≤ 7 c\leq 7 c≤7!&#xff01…

Deepin基本环境查看(四)【硬盘/分区、文件系统、硬连接/软连接】

Linux操作系统(Deepin、Ubuntu)操作系统中,硬盘分区的管理与Windows操作系统不同; 在Linux系统中维护着一个统一的文件目录体系,而硬盘和分区是以资源的形式由操作系统挂接和调度;此外Linux系统中连接(硬连…

R语言【taxlist】——get_children(),get_parents():检索分类概念的子类群或父类群

Package taxlist version 0.2.4 Description 检索所查询分类单元概念的所有子概念或父概念。 Usage get_children(taxlist, ...)## S3 method for class taxlist get_children(taxlist, ConceptID, ...)get_parents(taxlist, ...)## S3 method for class taxlist get_parents…

NTFS 磁盘管理 :NTFS Disk by Omi NTFS

NTFS Disk by Omi NTFS是一款专为Mac系统设计的NTFS文件系统读写解决方案的工具。它可以帮助Mac用户方便地访问和管理NTFS格式的硬盘、U盘、移动硬盘以及其他存储设备,提供高效稳定的NTFS卷管理功能。 NTFS 磁盘管理 :NTFS Disk by Omi NTFS 该软件的主…

【榜单公布】2023年度征文活动已结束

经过为期一个月的热情参与,CSDN 2023年度征文活动正式落下帷幕!那么今年又有哪些博主上榜了呢?一起来看下吧~~ 活动链接:https://activity.csdn.net/creatActivity?id10645 csdnid昵称链接qq_57761637鸽芷咕CSDN年度征文&#xf…

IDEA使用快捷键提炼函数(Extract Method)

IDEA使用快捷键提炼函数(Extract Method) 1、快捷键 ------ctrlaltM 2、右击操作--------选中待提炼代码 --> 右击 --> Refactor --> Extract --> Method. 3、举例 提炼前: public void printOwing(double amount) {printBa…

Mistral AI vs. Meta:顶级开源LLM比较

为了提高性能,大型语言模型(llm)通常会通过增加模型大小的方法来实现这个目标,但是模型大小的增加也增加了计算成本和推理延迟,增加了在实际场景中部署和使用llm的障碍。 Mistral AI是一家总部位于巴黎的欧洲公司,一直在研究如何…

QT基础篇(16)QT5单元测试框架

1.QTEstLib框架 QTestLib框架是一个用于软件测试的开源框架,是Qt工具套件的一部分。它提供了一组用于编写自动化测试和单元测试的类和函数。 QTestLib可以方便地为Qt应用程序编写单元测试,包括测试GUI和非GUI的代码。它提供了一系列断言和辅助函数&…

springboot自动配置的条件注解使用

1.ConditionalOnBean Configuration public class MyConfiguration {Beanpublic MyBean myBean() {return new MyBean();}BeanConditionalOnBean(MyBean.class)public AnotherBean anotherBean() {return new AnotherBean();} }在这个例子中: MyConfiguration 是一…

QT入门篇---无门槛学习

1.1 什么是 Qt Qt 是⼀个 跨平台的 C 图形⽤⼾界⾯应⽤程序框架 。它为应⽤程序开发者提供了建⽴艺术级图形界⾯所需的所有功能。它是完全⾯向对象的,很容易扩展。Qt 为开发者提供了⼀种基于组件的开发模式,开发者可以通过简单的拖拽和组合来实现复杂的…