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 接口来操作索引库,包括创建索引库、添加、删除文档、执行全文检索……等一切功能。

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

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

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

相关文章

故障诊断 | 一文解决,BP神经网络的故障诊断(Matlab)

文章目录 效果一览文章概述专栏介绍模型描述源码设计参考资料效果一览 文章概述 故障诊断 | 一文解决,BP神经网络的故障诊断(Matlab) 专栏介绍 订阅【故障诊断】专栏,不定期更新机器学习和深度学习在故障诊断中的应用;订阅

52个值得收藏的无代码AI平台【2024】

“无代码”不仅仅是炒作。 这是一场革命。 在无代码之前,如果你想制作一个网站,你需要一名技术网络开发人员。 现在,你可以使用 Bubble、Webflow、Carrd 或无数其他可视化工具。 人工智能领域也发生了同样的情况。 在无代码之前,你…

国网四川宜宾供电公司:基于“RPA+AI”融合技术的电网设备隐患缺陷智能化识别应用

推荐单位:国网四川省电力公司宜宾供电公司 本文作者:杨鑫、唐龙、钟睿、李小航、孙雪冬 摘 要:为推进电力企业生产业务数字化转型,提高基层班组数字化运维水平。本文通过一线班组对变电站视频巡视、设备故障判断应用场景需求分析…

搭建幻兽帕鲁需要什么样的服务器

作为一个开放世界生存制造类游戏《幻兽帕鲁》收获了空前绝后的热度,玩家们在游戏中通过在地图上捕捉收集到的“帕鲁”进行训练,合理利用他们的能力进行战斗,建立自己的家园、开辟新的世界、解锁新的冒险情节,获取更多游戏信息增加…

langchain+xray:prompt控制漏洞扫描

写在前面 xray是长亭推出的一款漏洞扫描工具。 langchain是调用LLM大模型完成自动化任务的框架。 本篇文章是对langchain自定义工具的探索,通过编写一个xray调用的工具,联合ChatGPT对xray进行调用,实现对目标的漏洞扫描。 xray功能分析 …

悄悄话 - 华为OD统一考试

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C 题目描述 给定一个二叉树,每个节点上站一个人,节点数字表示父节点到该节点传递悄悄话需要花费的时间。 初始时,根节点所在位置的人有一…

vue3.0 + 动态加载组件 + 全局注册组件

首先 vue 动态加载组件使用的是 component 标签&#xff0c;并通过设置组件的is 属性来指定要渲染的组件。例如&#xff1a; <component :is"currentComponent"></component>其中&#xff0c;currentComponent 是一个变量&#xff0c;它的值可以是以下几…

【图论】【状态压缩】【树】【深度优先搜索】1617. 统计子树中城市之间最大距离

作者推荐 【动态规划】【字符串】【行程码】1531. 压缩字符串 本文涉及的知识点 图论 深度优先搜索 状态压缩 树 LeetCode1617. 统计子树中城市之间最大距离 给你 n 个城市&#xff0c;编号为从 1 到 n 。同时给你一个大小为 n-1 的数组 edges &#xff0c;其中 edges[i] …

FPGA工程师的重要技能

写代码是最难的嘛&#xff1f; 不是 会调试代码才是你的闪光点&#xff01;&#xff01; 很多人觉得写代码是最重要的但这不是一个优秀的FPGA工程师的核心竞争力 企业工作也更加注重你调试代码的能力 因此我们的课程老师对课程设计也是很有要求的 写代码是最难的嘛&#…

HT71663 13V,12A全集成同步升压转换器 中文资料 规格书

HT71663是一款高功率、全集成升压转换器&#xff0c;集成16mΩ功率开关管和23mΩ同步整流管&#xff0c;为便携式系统提供G效的小尺寸处理方案。 HT71663具有2.7V至13V宽输入电压范围&#xff0c;可为采用单节或两节锂电池的应用提供支持。该器件具备10A开关电流能力&#xff…

CHS_05.2.3.4_1+信号量机制

CHS_05.2.3.4_1信号量机制 知识总览信号量机制信号量机制——整型信号量信号量机制——记录型信号量知识回顾 在这个小节中 我们会学习信号量 机制这个极其重要的知识点 知识总览 在考研当中 我们需要掌握两种类型的信号量 一种是整形信号量 另一种是记录型信号量 我们会在后面…

数字孪生模型优化平台

老子云模型优化服务平台 一、模型优化 使用单模型轻量化、格式转换、倾斜摄影轻量化服务。 1、格式转换 只需上传原始单模型文件&#xff0c;就能在云端自动发起转换。 服务介绍&#xff1a; 支持格式输出为FBX、OBJ、STL、STP格式&#xff08;其他输出格式陆续上线中&…

企业级大数据安全架构(七)服务安全

作者&#xff1a;楼高 在企业级大数据安全方案中&#xff0c;本节主要介绍服务安全问题&#xff0c;引入kerberos认证机制&#xff0c;目前直接对接kerberos使用较多&#xff0c;这里我们使用FreeIPA来集成kerberos FreeIPA官网下载地址&#xff1a;https://www.freeipa.org/p…

Android systemui 编译

目录 简介&#xff1a; 一、步骤 二、下载源码 三、环境配置 四、确定好需要编译版本 五、编译SystemUI 步骤1&#xff1a;进入源代码目录 步骤2&#xff1a;初始化编译环境 步骤3&#xff1a;选择目标设备 步骤4&#xff1a;编译SystemUI 步骤5&#xff1a;查找生成…

指针的深入了解6

1.回调函数 回调函数就是一个通过函数指针调用的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指针被用来调用其所指向的函数 时&#xff0c;被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用&#xff0…

【Tomcat与网络5】再论Tomcat的工作过程与两种经典的设计模式

前面两篇&#xff0c;我们重点分析了Tomcat的容器和连接器的基本设计&#xff0c;今天我们来看一下两个机构如何在service的调度下进行协同工作的。 目录 1.模板模式与Tomcat的重用性设计 2.观察者模式与Tomcat可扩展性设计 1.模板模式与Tomcat的重用性设计 首先&#xff0…

车规级高压LDO正式上线

随着汽车电子行业向着智能化、物联网化的趋势发展&#xff0c;LDO的性能在车载电源设计中变得越来越重要。由于车载应用使用电池供电&#xff0c;所以对系统待机功耗有较高要求。例如感应雨刷、感应后备箱、自动大灯等功能&#xff0c;在触发前都需要保持低功耗工作&#xff0c…

Pandas.DataFrame.quantile() 分位数 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本&#xff1a; 本文基于 pandas2.2.0 编写。 关于本文内容更新&#xff1a; 随着pandas的stable版本更迭&#xff0c;本文持续更新&#xff0c;不断完善补充。 传送门&#xff1a; Pandas API参考目录 传送门&#xff1a; Pandas 版本更新及新特性 传送门&…

Flask 入门2:路由

1. 前言 在上一节中&#xff0c;我们使用到了静态路由&#xff0c;即一个路由规则对应一个 URL。而在实际应用中&#xff0c;更多使用的则是动态路由&#xff0c;它的 URL是可变的。 2. 定义一个很常见的路由地址 app.route(/user/<username>) def user(username):ret…

java servlet勤工助学家教管系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java servlet 勤工助学家教管系统是一套完善的java web信息管理系统 serlvetdaobean mvc 模式开发 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myecli…