01、全文检索 ------ 反向索引库 与 Lucene 的介绍

目录

  • 全文检索 ------ 反向索引库 与 Lucene
    • SQL模糊查询的问题
    • 反向索引库
      • 反向索引库的查询
    • Lucene(全文检索技术)
      • Lucene能做什么
      • Lucene存在的问题
      • Solr 和 Elasticsearch 与 Lucene 的关系

全文检索 ------ 反向索引库 与 Lucene


MySQL一些索引词汇解释


SQL模糊查询的问题


如这条 like 模糊查询的 sql

select * fromwhere description like "%疯狂%"

这种 like 的模糊查询,也没办法通过索引查询。

SQL模糊查询(like)只能逐个、逐个地搜索。比如要查询 description 列是否包含了 “ 疯狂 ” 关键字。当字符串内容较多时,本身就需要花费较多的时间来逐个匹配。

如图:
用like 模糊查询 “疯狂” 两字,需要对每一行的数据都进行两个字符两个字符逐个匹配,如下图,表示对这一行数据的逐个匹配的过程。
在这里插入图片描述

当处理100条记录时,模糊查询的时间开销就是单条记录的处理时间 再乘以100;

当处理千万条记录时,模糊查询的时间开销就是单条记录的处理时间 再乘以千万。


关于使用模糊查询 like 是否会导致索引失效的问题:

用like做查询时,通配符% 放在字段值后面(样子为—>xxx%),进行前缀查询,索引就能使用,

前缀查询的样子abc%,就可以拿a、b、c先去索引树进行匹配,所以索引就可以使用。

如果把通配符%放在字段值最前面来进行后缀查询(样子为—>%xxx),那么索引就会失效。

比如后缀查询的样子是 【%abc】,我们根本不知道%是什么值,也就没办法在索引树进行比对,所以索引就会失效


反向索引库


为了解决 like 模糊查询性能不好的问题,Lucene 做出了一个革命性的创新:先建立反向索引库,再通过反向索引库进行检索。

反向索引库: 需要先对目标内容进行分词,然后以【分好的关键词】为 key 建立索引库,value 保存了该key出现在哪些文档中、出现在文档中哪些位置等信息。


解释如图:

原先有这么一张表,这个表里面有一些数据,然后通过分关键词来建立一个索引库。

如图:
“spring” 这个关键词,存在旧表中 id=1 的那一行数据里面,那么在新建立的索引库里面对该关键字给标识上 1;
“强大” 这个关键词,在旧表 id =1 和 id=2 那两行数据里面都存在,那么在新建立的索引库里面也标识了该id,标识了 1,2;
如果我们要全文检索 “强大” 这个词,那么就会直接去旧表查id=1 和 id=2 这两行数据。
而不用对整张表的每一行数据都查一次。
在这里插入图片描述

相当于把 like 的查询策略给去掉了。
对反向索引库的查询,立即就变成了原来的 = 查询,相当于如下条件:
“where 关键词列 = 要查询的关键词 ” 查询,而且这关键词列在反向索引库肯定是有索引的(比如btree索引),
这意味着在反向索引库中对该关键词列(就是上图中的key)的检索完全不需要整个表扫描。


反向索引库的查询


对 “关键词”列 执行查询有两个特征:

  1. 不需要使用LIKE模糊查询,性能很好。
  2. "关键词"列本身带有聚簇索引,性能很好。

通过“关键字”列中可以很迅速地找到“疯狂”关键字,一旦找到“疯狂”关键字之后,接下来就可通过它对应的value发现,该关键字出现了1、2两个文档中,还可以发现该关键字在1、2两个文档中的位置……等更多详细信息。


不管哪一种语言,它能支持的“词”是有限的,以英语为例,大部分母语为英语的大学生词汇量大约在3万左右;

类似的,中文的汉字、单词也是有限的。

不管目标文档是百万条也好,是百亿条也好,反向索引库的关键字并不会显著增加,

因此对“关键词”列的检索性能总是有保证的。



Lucene(全文检索技术)

Lucene 利用了反向索引库的特征,从而为全文检索提供了性能保证。

Lucene 是目前世界上最流行的全文检索框架

Lucene 解决了传统SQL查询搞不定的情况,或者用SQL语句能够搞定查询,但要用到很多LIKE……OR时,查询就会很慢。此时就要用到 Lucene 全文检索技术。



Lucene能做什么


Lucene能开发搜索引擎吗?

实际上这并非不可能,当然单独的Lucene可能做不到,一个互联网搜索引擎至少需要解决以下三个核心问题:

  1. 全文检索。
  2. 海量信息的自动搜索,需要用到网络爬虫从互联网上爬取信息。
  3. 海量信息的分布式存储、管理,例如 Cassandra、MongoDB 等

单独的 Lucene 通常用于实现单个的站内搜索功能,只检索本应用内的信息。


Lucene存在的问题

Lucene本身的API比较难用,Lucene框架的开发者应该不是Java开发者,因此他设计的Lucene API比较晦涩,难用。

最大的问题:Luence 只是一个 Java 框架,因此只有 Java 程序员才能使用 Lucene 为项目添加全文检索功能。此时就需要一个跨平台、跨语言的接口。



Solr 和 Elasticsearch 与 Lucene 的关系

Solr、Elasticsearch 等技术对 Lucene 进行了包装,包装之后的 Solr、Elasticsearch 不再是简单的框架,更像一个搜索引擎的服务器。

虽然 Solr、Elasticsearch 底层都是基于 Lucene,但它们自己提供了对 Lucene 索引库的操作、管理,开发者不再需要直接面向 Lucene API 编程,而是面向 Solr、Elasticsearch 所提供 RESTful 接口(跨平台、跨语言)来编程,

这意味着开发者不管使用哪种语言,甚至不管他会不会编程,只要他会用工具发送请求(比如 Postman、curl 等),那就能调用 Solr、Elasticsearch 的 RESTful 接口来操作索引库,包括创建索引库、添加、删除文档、执行全文检索……等一切功能。

优势:降低开发者的要求(使用起来更方便)、没有开发语言的限制。

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

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

相关文章

如何使用Docker部署JSON Crack

文章目录 1. 在Linux上使用Docker安装JSONCrack2. 安装Cpolar内网穿透工具3. 配置JSON Crack界面公网地址4. 远程访问 JSONCrack 界面5. 固定 JSONCrack公网地址 JSON Crack 是一款免费的开源数据可视化应用程序,能够将 JSON、YAML、XML、CSV 等数据格式可视化为交互…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷9

某企业根据自身业务需求,实施数字化转型,规划和建设数字化平台,平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”,拟采用开源OpenStack搭建企业内部私有云平台,开源Kubernetes搭建云原生服务平台,选…

【算法】Partitioning the Array(数论)

题目 Allen has an array a1,a2,…,an. For every positive integer k that is a divisor of n, Allen does the following: He partitions the array into n/k disjoint subarrays of length k. In other words, he partitions the array into the following subarrays: [a1,…

3 款最好的电脑硬盘数据迁移软件

您将从本页了解 3 款最好的 SSD硬盘数据迁移软件,磁盘供应商提供的软件和可靠的第三方软件。仔细阅读本文并做出您的选择。 什么是数据迁移? 数据迁移是将数据移动到其他计算机或存储设备的过程。在日常工作活动中,常见的数据迁移有三种&…

[Vue3] useRoute、useRouter

useRoute 返回当前路由地址。相当于在模板中使用 $route。必须在 setup() 中调用。用于在组件中获取当前路由的信息,返回一个包含路由信息的对象。这个函数适用于那些不需要监听路由变化的场景,只是获取当前路由信息的静态数据。 useRouter 返回 route…

[嵌入式系统-7]:龙芯1B 开发学习套件 -4- LoongIDE 集成开发工具的使用-创建应用程序工程、编译、下载、调试

目录 前言: 步骤1:设置工作工作空间 步骤2:设置工具链 步骤3:创建裸机应用程序 步骤4:创建带实时操作系统的应用程序 步骤5:编译 步骤6:下载调试 前言: LoongIDE集成开发环境…

ubuntu gedit主题更改

ubuntu16.04 gedit 编辑器又有首选项如何设置主题 这里下载主题 将主题XML复制到 /usr/share/gtksourceview-3.0/styles 文件夹内; 使用gsettings 命令设置喜欢的配色方案,使用方式如下:(实测不带.xml后缀哦) gsettings set org.gnome.gedi…

CleanMyMac X.4.14.6中文版新功能介绍,mac系统垃圾清理

近些年伴随着苹果生态的蓬勃发展,越来越多的用户开始尝试接触Mac电脑。然而很多人上手Mac后会发现,它的使用逻辑与Windows存在很多不同,而且随着使用时间的增加,一些奇奇怪怪的文件也会占据有限的磁盘空间,进而影响使用…

Docker本地部署Firefox浏览器并结合内网穿透公网访问

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器,由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…

Windows Server 2025 Azure Arc 介绍

Azure Arc 是一个扩展 Azure 平台的桥梁,可帮助你构建可灵活地跨数据中心、边缘和多云环境运行的应用程序和服务。使用一致的开发、操作和安全模型来开发云原生应用程序。 Azure Arc 可在新的和现有的硬件、虚拟化和 Kubernetes 平台、物联网设备和集成系统上运行。…

数据可视化工具之选,三选一?

在数据可视化的世界中,选择一款合适的工具对于提升工作效率和洞察力至关重要。本文将对三款主流数据可视化工具进行详细比较,包括山海鲸可视化、Echarts和D3.js,以帮助您做出明智的选择。 山海鲸可视化 山海鲸可视化是一款免费且功能强大的…

如何监控两台android设备之间串口通讯的ADB日志?

如果你的目标是将设备通过 Wi-Fi 连接到计算机,可以执行以下步骤: 一.通过 USB 连接设备: adb devices 确保设备通过 USB 连接,并且可以通过 adb devices 命令正常识别。 二、将设备1和设备2都切换到 TCP/IP 模式:…

Mac网线上网绿联扩展坞连接网线直接上网-无脑操作

声明:博主使用的绿联扩展坞 以下为绿联扩展坞Mac网线使用方法 1.首先需要下载电脑对应版本的驱动 直接点击即可下载 2. 下载好以后 解压 点进去 对应版本 博主直接使用最新的12-14 3. 安装包好了以后 会提示重启电脑 此时拔掉扩展坞 再重启动 拔掉扩展坞 再重启…

UE4 C++ 数据表

//基于结构体变量类型,创建数据表DataTable类型 USTRUCT(BlueprintType) struct FMyDataTableStruct : public FTableRowBase //把结构体变量公开到数据表类型 {GENERATED_BODY() //必须添加“GENERATED_BODY()”UPROPERTY(EditAnywhere, BlueprintReadWrite, Categ…

房屋租赁系统-java

思维导图:业务逻辑 类的存放: 工具类 Utility package study.houserent.util; import java.util.*; /***/ public class Utility {//静态属性。。。private static Scanner scanner new Scanner(System.in);/*** 功能:读取键盘输入的一个菜单…

嵌入式学习第十五天!(内存管理、链表)

1. 内存管理: 1. malloc void *malloc(size_t size); 功能:申请堆区空间 参数:size:申请堆区空间的大小 返回值:返回获得的空间的首地址,失败返回NULL 2. free void free(void *ptr); 功能:释…

父元素flex:1 高度却被子元素撑开的问题

问题 当父元素设置了flex: 1; 的情况下,想在其中子元素超出父元素高度的情况下,产生滚动条,在父元素区域滚动。由于子元素高度不固定,故父元素设置为display: flex; flex-direction: column; 子元素设置flex: 1; overflow: auto;…

@JsonIgnore的使用及相关问题的解决

目录 1 前言 2 对比及其使用方法 3 遇到的相关问题及解决方法 1 前言 在我们编写的后端项目中,有时候可能需要将某个实体类以JSON格式传送给前端,但是其中可能有部分内容我们并不想传送,这时候我们选择将这部分内容变成Null,这…

Windows登录了微软账号,共享/远程怎么输入密码都不对?看这篇能解决

前言 Windows自从登录了微软账号之后,感觉生活都美好了很多。毕竟同步书签,还有无缝衔接作业等操作都是比较舒服的。 但是对于喜欢远程桌面连接电脑进行操作或者共享文件夹给别的设备访问的小伙伴就有些烦恼了。 在本地账户使用的时候,密码输…

共享的IP隔一段时间就变?用这种方法可以不需要知道电脑IP

前言 一般来说,电脑接入路由器之后,IP是由路由器自动分配的(DHCP),但如果隔一段时间不开机连接路由器,或者更换了别的网卡进行连接,自动分配的IP就会更改。 比如你手机连接着电脑的共享IP:192.168.1.10,但过段时间之后,电脑的IP突然变成了192.168.1.11,那么你的所有…