掌握它才说明你真正懂 Elasticsearch - Lucene (一)

这篇具有很好参考价值的文章主要介绍了掌握它才说明你真正懂 Elasticsearch - Lucene (一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Lucene 简介
Lucene 是一种高性能、可伸缩的信息搜索(IR)库,在 2000 年开源,最初由鼎鼎大名的 Doug Cutting 开发,是基于 Java 实现的高性能的开源项目。

Lucene 采用了基于倒排表的设计原理,可以非常高效地实现文本查找,在底层采用了分段的存储模式,使它在读写时几乎完全避免了锁的出现,大大提升了读写性能。

核心模块
Lucene 的写流程和读流程如下图所示:

其中,虚线箭头(a、b、c、d)表示写索引的主要过程,实线箭头(1-9)表示查询的主要过程。

Lucene 中的主要模块及模块说明如下:

analysis:主要负责词法分析及语言处理,也就是我们常说的分词,通过该模块可最终形成存储或者搜索的最小单元 Term。

index 模块:主要负责索引的创建工作。

store 模块:主要负责索引的读写,主要是对文件的一些操作,其主要目的是抽象出和平台文件系统无关的存储。

queryParser 模块:主要负责语法分析,把我们的查询语句生成 Lucene 底层可以识别的条件。

search 模块:主要负责对索引的搜索工作。

similarity 模块:主要负责相关性打分和排序的实现

核心术语
下面介绍 Lucene 中的核心术语:

Term:是索引里最小的存储和查询单元,对于英文来说一般是指一个单词,对于中文来说一般是指一个分词后的词。

词典(Term Dictionary,也叫作字典):是 Term 的集合。词典的数据结构可以有很多种,每种都有自己的优缺点。

比如:排序数组通过二分查找来检索数据:HashMap(哈希表)比排序数组的检索速度更快,但是会浪费存储空间。

FST (finite-state transducer) 有更高的数据压缩率和查询效率,因为词典是常驻内存的,而 FST 有很好的压缩率,所以 FST 在 Lucene 的最新版本中有非常多的使用场景,也是默认的词典数据结构。

倒排序(Posting List):一篇文章通常由多个词组成,倒排表记录的是某个词在哪些文章中出现过。

正向信息:原始的文档信息,可以用来做排序、聚合、展示等。

段(Segment):索引中最小的独立存储单元。一个索引文件由一个或者多个段组成。在 Luence 中的段有不变性,也就是说段一旦生成,在其上只能有读操作,不能有写操作。

Lucene 的底层存储格式如下图所示,由词典和倒排序两部分组成,其中的词典就是 Term 的集合:


词典中的 Term 指向的文档链表的集合,叫做倒排表。词典和倒排表是 Lucene 中很重要的两种数据结构,是实现快速检索的重要基石。

词典和倒排表是分两部分存储的,在倒排序中不但存储了文档编号,还存储了词频等信息。

在上图所示的词典部分包含三个词条(Term):Elasticsearch、Lucene 和 Solr。词典数据是查询的入口,所以这部分数据是以 FST 的形式存储在内存中的。

在倒排表中,“Lucene” 指向有序链表 3,7,15,30,35,67,表示字符串 “Lucene” 在文档编号为 3、7、15、30、35、67 的文章中出现过,Elasticsearch 和 Solr 同理。
检索方式

在 Lucene 的查询过程中的主要检索方式有以下四种:

①单个词查询
指对一个 Term 进行查询。比如,若要查找包含字符串 “Lucene” 的文档,则只需在词典中找到 Term “Lucene”,再获得在倒排表中对应的文档链表即可。

②AND
指对多个集合求交集。比如,若要查找既包含字符串 “Lucene” 又包含字符串 “Solr” 的文档,则查找步骤如下:

在词典中找到 Term “Lucene”,得到 “Lucene” 对应的文档链表。

在词典中找到 Term “Solr”,得到 “Solr” 对应的文档链表。

合并链表,对两个文档链表做交集运算,合并后的结果既包含 “Lucene” 也包含 “Solr”。

③OR
指多个集合求并集。比如,若要查找包含字符串 “Luence” 或者包含字符串 “Solr” 的文档,则查找步骤如下:

在词典中找到 Term “Lucene”,得到 “Lucene” 对应的文档链表。

在词典中找到 Term “Solr”,得到 “Solr” 对应的文档链表。

合并链表,对两个文档链表做并集运算,合并后的结果包含 “Lucene” 或者包含 “Solr”。

④NOT
指对多个集合求差集。比如,若要查找包含字符串 “Solr” 但不包含字符串 “Lucene” 的文档,则查找步骤如下:

在词典中找到 Term “Lucene”,得到 “Lucene” 对应的文档链表。

在词典中找到 Term “Solr”,得到 “Solr” 对应的文档链表。

合并链表,对两个文档链表做差集运算,用包含 “Solr” 的文档集减去包含 “Lucene” 的文档集,运算后的结果就是包含 “Solr” 但不包含 “Lucene”。

通过上述四种查询方式,我们不难发现,由于 Lucene 是以倒排表的形式存储的。

所以在 Lucene 的查找过程中只需在词典中找到这些 Term,根据 Term 获得文档链表,然后根据具体的查询条件对链表进行交、并、差等操作,就可以准确地查到我们想要的结果。

相对于在关系型数据库中的 “Like” 查找要做全表扫描来说,这种思路是非常高效的。

虽然在索引创建时要做很多工作,但这种一次生成、多次使用的思路也是非常高明的。

————————————————
原文作者:CrazyZard
转自链接:https://learnku.com/articles/40398
版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。文章来源地址https://www.toymoban.com/news/detail-435389.html

到了这里,关于掌握它才说明你真正懂 Elasticsearch - Lucene (一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Lucene轻量级搜索引擎,Solr 和 ElasticSearch 都是基于 Lucene 的封装

    1、Lucene 是什么 Lucene 是一个本地全文搜索引擎,Solr 和 ElasticSearch 都是基于 Lucene 的封装 Lucene 适合那种轻量级的全文搜索,我就是服务器资源不够,如果上 ES 的话会很占用服务器资源,所有就选择了 Lucene 搜索引擎 2、倒排索引原理 全文搜索的原理是使用了倒排索引,那么什么是倒

    2024年03月15日
    浏览(71)
  • 《面试1v1》ElasticSearch 和 Lucene

    🍅 作者简介:王哥,CSDN2022博客总榜Top100🏆、博客专家💪 🍅 技术交流:定期更新Java硬核干货,不定期送书活动 🍅 王哥多年工作总结:Java学习路线总结, 点击 突击面试 🍅 数十万人的面试选择: 面试说人话系列《面试1v1》 我是 javapub,一名 Markdown 程序员从👨‍💻,

    2024年02月14日
    浏览(44)
  • Lucene和Solr和Elasticsearch区别,全文检索引擎工具包Lucene索引流程和搜索流程实操

    我们生活中的数据总体分为两种: 结构化数据和非结构化数据 。 结构化数据 :指具有固定格式或有限长度的数据,如数据库,元数据等。 非结构化数据 :指不定长或无固定格式的数据,如 互联网数据、邮件,word文档等。 非结构化数据又有一种叫法叫全文数据 按照数据的

    2024年02月03日
    浏览(42)
  • ElasticSearch学习篇10_Lucene数据存储之BKD动态磁盘树

    基础的数据结构如二叉树衍生的的平衡二叉搜索树通过左旋右旋调整树的平衡维护数据,靠着二分算法能满足一维度数据的logN时间复杂度的近似搜索。对于大规模多维度数据近似搜索,Lucene采用一种BKD结构,该结构能很好的空间利用率和性能。 本片博客主要学习常见的多维

    2024年03月15日
    浏览(46)
  • 从根上理解elasticsearch(lucene)查询原理(1)-lucece查询逻辑介绍

    大家好,最近在做一些elasticsearch 慢查询优化的事情,通常用分析elasticsearch 慢查询的时候可以通过profile api 去分析,分析结果显示的底层lucene在搜索过程中使用到的函数调用。所以要想彻底弄懂elasticsearch慢查询的原因,还必须将lucene的查询原理搞懂,今天我们就先来介绍下

    2024年02月04日
    浏览(38)
  • ElasticSearch学习篇8_Lucene之数据存储(Stored Field、DocValue、BKD Tree)

    Lucene全文检索主要分为索引、搜索两个过程,对于索引过程就是将文档磁盘存储然后按照指定格式构建索引文件,其中涉及数据存储一些压缩、数据结构设计还是很巧妙的,下面主要记录学习过程中的StoredField、DocValue以及磁盘BKD Tree的一些相关知识。 参考: https://juejin.cn/p

    2024年02月03日
    浏览(32)
  • ClassNotFoundException: org.elasticsearch.client.Cancellable 和nosuchfielderror:lucene_8_0_0

    一天时间都在解决这个问题。做一下笔记吧 在做springcloud整合es7.6.2出现了一些问题。 两个主要的报错: 先解决第一个: ClassNotFoundException: org.elasticsearch.client.Cancellable 我的maven配置 配置类也配置了 然后在启动时就报了以下错误 看了一下相关的博客,得出是版本依赖不一致的

    2024年02月04日
    浏览(42)
  • elasticsearch中的数据类型search_as_you_type及查看底层Lucene索引

    search_as_you_type字段类型用于自动补全,当用户输入搜索的时候,还没输完就可以提示用户相关内容。as_you_type应该是说当你打字的时候。它会给索引里的这个类型的字段添加一些子字段_2gram _3gram和_index_prefix。_2gram的意思是,如果一个值是abcd, 2 gram就是ab bc cd, 3 gram就是

    2024年02月12日
    浏览(48)
  • Elasticsearch 8.9 refresh刷Es缓冲区的数据到Lucene,更新segemnt,使数据可见

    下面的图来自ElasticSearch——刷盘原理流程,这篇文章主要讲的是refresh命令把ES写入索引缓冲区的数据刷进Lucene,使数据可供查询,搜索,否则,在索引缓冲区是不可见的,不涉及到在 translog.log 和 Lucene 的数据结构。 通过这个流程知道ES如何把索引缓冲区的数据刷进Lucene的,

    2024年02月04日
    浏览(41)
  • 我们都低估了GPT-4,它才是梦开始的地方

    从今年开始 最近这两个月 AI技术带来的冲击一个接一个 我们的团队都在忙着研究各种AI 性能力这个方面 还真不如自己马上上手 用这些软件感受来的那么强烈 我觉得至少有几个产品 大家可以去试一下 第一 大家赶紧去看一个church GBT plus的账号 然后亲身体验一下GPT4的底层能力

    2023年04月12日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包