-
第二点必须准确吧,假如我搜索关键词电脑,结果搜索出来的结果是一些奇奇怪怪的东西,要是在这时候投屏怕不是会陷入社死的尴尬吧。
-
第三点对于我这种比较粗心的人还是需要有一点的容忍度,哪怕输错其中一个字,也可以给出相关的搜索结果。
-
第四点对于大部分人而言,相信大多数人都会希望进行搜索的时候可以有相关的搜索选项提供选择,而不是都是需要自己相办法去思考所有的关键词,毕竟人都是喜欢偷懒的,从某种程度上而言,人们的偷懒促进了现代社会的发展。
说完这几点相信很多的搜索引擎都是奔着这几个目标去的,显而易见 ElasticSearch 满足了上面所有的搜索的基本要求,相信小白(包括我啦)到这里都很想去尝试一下,网上的安装教程和简单 HelloWorld 都是有的,可以自己使用单机版简单的玩耍一下,在这里就不一一赘述了。简单的 Demo 过后是不是很多人都好奇 ElasticSearch 搜索的具体实现方式是怎么实现的,是依靠什么满足上诉第一点的要求,那么开启接下来的里程吧。
倒排索引
抽象模型
众所周知的是 ElastichSearch 使用的是 Lucene 来作为底层的框架来进行一个数据的搜索, Lucene 则是一个高性能的全文检索引擎工具,很多的搜索引擎都是以 Lucene 为工具包,进行二次开发,那么究竟是什么使得 Lucene 这个工具,具有如此的魅力,提到这个就不得不说一下他的一个独特数据结构-倒排索引了。
接下来进入正式环节。在说倒排索引之前,先进行我们正常的思路是如何来对下列的数据进行一个检索的。
普通按照我们正常的思路来进行一个全文的检索,就是使用一个遍历的方式来进行一个关键字的获取,比如我们要检索关键字 keyworld1 时就需要把所有的数据进行检索一编,当然在数据量小的时候这并没有什么影响,反而因为简单处理会速度比较快,没有那么多的性能问题,但是当数据量以百万或者千万级别以上进行的时候就不行了,这个时候遍历一下的速度是我们难以忍受的,如果要花很多的时间好像就没有人愿意进行一个等待了。
为了解决这方面的问题就提出了倒排索引这个比较独特的数据结构,来解决相关的搜索性能问题:那么这种数据结构是怎么样的呢,首先我们给出一个抽象的示意图。
倒排索引对刚进来的文档进行一个索引的构建,把一份文档中所有出现过的关键字放入一个列表中,这个列表被称为单词辞典也就是对应上图的绿色部分,而相对应的文档则是如右侧的红色节点所示,当然,对应的文档不一定是按照列表显示的,也可以选择其他的数据结构比如 B+ 树之类的,当然文档 1 ,这个节点并不是说就存储了相对应的文档,而是存储了这个文档的唯一标志 id ,通过这个 id 可以快速的定位文档的位置。除此之外还要可能红色节点存储了相应的出现的频次,这为后续的给出的排序提供了依据括号表示相应的频次,当然节点里面的数据不一定只有这么一点,肯定还是有很多其他的统计。 那么肯定会有人问如果是模糊搜索是怎么排序,那么肯定是检索绿色的这排,给出相关的文档,排序什么的是按照自己定义的一些规则来进行匹配,后续文章会给出相关性的算法。
大致倒排索引的理论是这样子的,那么就给出相关的例子进行说明一下,以我们之前给出的 HelloWorld 版本进行说明 两个文档的 Json 如下
[
{
“id”: “2”,
“name”: “second Helloworld 2”,
“organizer”: “wangwu”,
“version”: “1.0”
},
{
“id”: “1”,
“name”: “ElasticSearch Helloworld”,
“organizer”: “qingtong”,
“version”: “1.0”
}
]
复制代码
ElasticSearch 会为了每一个字段建立一个倒排索引,那么我们以 name 这个字段的倒排索引为例:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
2021年Java中高级面试必备知识点总结
在这个部分总结了2019年到目前为止Java常见面试问题,取其面试核心编写成这份文档笔记,从中分析面试官的心理,摸清面试官的“套路”,可以说搞定90%以上的Java中高级面试没一点难度。
本节总结的内容涵盖了:消息队列、Redis缓存、分库分表、读写分离、设计高并发系统、分布式系统、高可用系统、SpringCloud微服务架构等一系列互联网主流高级技术的知识点。
目录:
(上述只是一个整体目录大纲,每个点里面都有如下所示的详细内容,从面试问题——分析面试官心理——剖析面试题——完美解答的一个过程)
部分内容:
对于每一个做技术的来说,学习是不能停止的,小编把2019年到目前为止Java的核心知识提炼出来了,无论你现在是处于什么阶段,如你所见,这份文档的内容无论是对于你找面试工作还是提升技术广度深度都是完美的。
不想被后浪淘汰的话,赶紧搞起来吧,高清完整版一共是888页,需要的话可以点赞+关注
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
话,赶紧搞起来吧,高清完整版一共是888页,需要的话可以点赞+关注
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!