养成习惯,先赞后看!!
我们先通过通过官方的解释来理解一下什么是搜索引擎.当然了我们之后会通过更加通俗的方式来详细讲解搜索引擎的概念.
维基百科对于搜索引擎的介绍:
搜索引擎(英语:search engine)是一种信息检索系统,旨在协助搜索存储在计算机系统中的信息。搜索结果一般被称为“hits”,通常会以表单的形式列出。网络搜索引擎是最常见、公开的一种搜索引擎,其功能为 搜索万维网上储存的信息
。
其实维基百科的解释比较到位的,说白了搜索引擎就是一个帮助我们 快速检索信息
的工具.
但是大家又要说了,概念是知道了但是我好想没怎么用过搜索引擎啊.
相信我,其实大家 每天都在接触搜索引擎 ,这里我们可以举一个非常简单的栗子.
如果我们使用的是谷歌浏览器的话,那么我们在设置里面就能看到这么一个选项就是更换我们的搜索引擎.
大家看到选项之后就能知道搜索引擎具体有哪些了.这里谷歌为我们提供了好几个选项,像我们常用得 百度,360
这些都是属于搜索引擎.当然了像 阿里的夸克,搜狗,UC
等等都是搜索引擎.
既然说到搜索引擎的搜索,那么我们相应的,我们就会想到数据库里面的搜索,那么我们就会问同样是搜索为什么最后选择通过搜索引擎来实现搜索而不是通过数据库来实现搜索呢?
其实我们通过上面的概念能够总结出搜索引擎的一个最最最最最最大的特点就是搜索的速度非常的快 ,大家都知道数据库在 百万级别的数据量 的时候就会明显表现出 搜索能力的下降
,必须通过 优化SQL的方式才能提高运行的速度
,但是搜索引擎因为在 底层的搜索算法
上面就和数据库的搜索不同,这就使得搜索引擎本质上搜索的速度就呈现 飞一般感觉
既然这样我们肯定就会想,卧槽快快快,到底他们俩的算法有什么区别呢? Come on! Just Teach Me!
既然我们想要知道搜索引擎为什么这么快的话,我们就必须要将他与数据库 横向对比,这样才能够体现出他为什么强大.
我们先来讲解一下数据库底层的搜索算法-正排索引:
再讲解正排索引之前,我们需要先明白数据库关于搜索的一些流程,在数据库中相信大家都十分清楚主键这个概念吧,接下来我们需要明确下面主键的这几个概念以及搜索内容的概念,需要先明白这几个概念,后续才能更好的理解:
身份证,电话号码
等等这些行业里面特定的主键,一般是会通过int来定义主键的.就算在前台显示,也是显示前端写好的序号即递升的主键:1,2,3,4.......n
,这就是使得使用前台使用搜索功能的用户 一般是不会直接搜索主键的,毕竟他们根本就不知道主键是啥,在哪里看.明白了上述四点内容之后我们再来讲解正排索引,正排索引的概念其实很简单他就是按照我们的主键顺序查找,根据主键找到该对象之后,在依次将该对象的属性与用户输入的内容进行匹配,如果匹配到就停止,如果没有的话就继续重复上面的查找过程.
接下来查我们通过一个简单的栗子来不夯筑我们理解一下: 假设我们到一个教室里面找小明同学,但是呢我们只知道这些学生的学号,那么显然我们的查找过程应该是这样的:
显然这样的效率是不行的,首先先要按照主键顺序查找相应的对象,其次就是需要校验对象的每个对象是否与我们搜索的内容匹配,如果对象的属性多的离奇,那么这个过程会更加的消耗时间.
接下来我们再讲解一下搜索引擎的搜索算法-倒排索引:
倒排索引则采取了另外一种方式来存储数据,他在与数据库中的数据绑定之后他会将数据库中的数据进行重构,先将对象的各项属性进行分词处理
,处理完成之后将相应的属性与他们的主键进行绑定但是这个绑定过程不再是主键----属性
的格式,而是更换成属性分词----主键
的形式,这样进行搜索匹配的过程中就可以直接匹配属性,之后再将最后查询出来的主键进行匹配即可.可能这样说大家不是很能理解,我们还是通过下面的栗子来帮助大家理解:
显然这样是能够极大的降低查询的时间的,因为我们 可以直接将主键对象与我们的内容进行匹配
了,不用先找到对象之后再比对对象的属性这么麻烦了.
如果还是不是能够理解的话,我们再通过下面的栗子加深理解: 假设我们数据库中的 数据是这样的:
假设我们查询 功夫熊猫 这个内容,那么显然我们数据库搜索的过程就是这样的
我们再来看我们搜索引擎的搜索过程:
首先我们会将数据重构成这样
将数据重构成这样之后,我们再来看看搜索引擎的搜索过程:
每获得一个分词之后就只检查是不是剩下的分词中的一个,并且 记录主键是采取数据交集的策略
,这样就使得搜索的速度大大加快.
接下来的是我自己的想法,可能说的不对,大家就当看着玩玩
!!
如果用两个数据结构分别来表示正排索引以及倒排索引的话,可以是下面这样:
链表----正排索引
每次都必须按序查找,就像链表一样,必须从头开始查找
,并且也像链表的比对过程一样.
Map----倒排索引
也是需要 按序查找
,但是查找的过程变得简便很多,匹配之后就可以像Map一样直接取出相应的主键值,类似于Map的get()方法,直接获取key的value值
了解完什么是搜索引擎之后,我们再来看看目前主流的搜索引擎运用的 技术 有哪些?
目前主流的搜索引擎技术主要有两大家:
接下来我们简单介绍一下这两者:
其实Solr与ElasticSearch两者的底层都是通过Apache的Lucene来实现的,只是Solr先被开发出来而已,ElasticSearch后开发出来而已.两者的基本功能其实相差不大,只是一些特定的方位内存在差异
Solr
:
优点:
多种数据格式
:json,xml,html等等等非实时搜索
的 情况下搜索的速度更快缺点:
速度明显降低
ElasticSearch
:
优点:
实时搜索
,搜索速度不会降低分布式
缺点:
介绍完上面的所有内容之后,就需要学习使用了,这里我选择的是ElasticSearch,因为他对新手更加的友好,配置相对简单,所以我选择了ElasticSearch.
接下来就是ElasticSearch的安装了.
elasticsearch.yml(主要配置ElasticSearch集群信息) jvm.options(jvm内存信息)
这时候这些文件都是没有权限的,我么你需要给这些文件分配权限
解压文件: tar -zxvf elasticsearch-6.3.1.tar.gz
主要就是elasticSearch的默认内存太大,可能超过了我们服务的承受范围,我这里默认的是1G
这里我们把他修改成256M 之后再去启动试试:
之后我们可能会遇到这个问题:
原因是在elasticSearch5.0版本
以后,很多大公司也已经开始采用ElasticSearch作为他们搜索引擎的技术了,大公司使用之后发现ElasticSearch存在安全漏洞,因为在5版本的ElasticSearch中,ElasticSearch运行都是通过root用户进行的
,所以有些黑客就通过这个特性直接获取到root用户的密码以及其他信息
,使得信息外泄.
所以在5版本之后,ElasticSearch都开始采用这种方案,即所有的操作不能再是root用户
,必须单独创建一个用户
来操作elasticSearch.
所以我们如果按照默认的配置文件来启动ElasticSearch的话就还是通过root用户启动,所以我们需要重新创建一位用户并且通过在该用户的状态下启动ElasticSearch.
//创建一个新的用户 adduser es //切换到es用户下 su es
切换完成之后我们能够发现,前面的用户就已经改变了
,并且命令前面的符号也已经发生改变了.不再是#号,而是换成了$符号
之后我们再来重新启动一下elasticSearch试试
之后我们又遇到这个问题,意思是:我们的es用户没有权限访问该文件jvm.options 所以我们需要切换回root用户去修改以下es用户的访问权限 //切换成root用户 su root //返回上级目录 cd .. //进入config cd config //将config下的所有文件都给予最大权限 chmod 777 * 这样我们的es用户即可访问jvm.options文件了. 之后我们再去重新启动一下我们的elasticSearch但是我们又会遇到下面的问题
该问题主要是es用户没有权限访问data文件夹(data是es的软件和日志数据目录)
这里为了解决之后所有可能遇到的权限不足的问题,我们决定通过切换到root用户,之后将elasticSearch的根目录下将所有的文件的权限都打开,但是 不建议大家这样做,最好是启动之后哪里报权限不足的时候,我们在依次切换到root用户去将相应的文件的权限打开.
我们切换到root用户之后,使用下面的命令将elasticSearch下的文件通过轮询的方式将权限都打开.
chmod 777 -R elasticsearch-6.3.1
这样我们就已经将所有文件的权限都已经打开了,这时候我们切换成es用户来进行我们接下来的操作.
之后我们需要去配置我们的默认ip以及端口号,这样外网才能访问我们的elasticSearch
这里我们是在elasticsearch.yml文件里面进行配置:
进去之后我们主要配置这两个参数: 如果不是云服务器的话,你就直接按下面我的提示配置即可
如果你是云服务器的话,那么你就不能这么配置了,如果还是按照上面的配置的话,那么我们启动elasticSearch就会出现下面的错误:
这时候我们需要这样配置:
记住这里不能填云服务器的公网ip地址,否则还是连不上的 并且这样配置完成之后,如果是云服务器,我们还需要在防火墙以及阿里云控制台打开9200以及9300两个端口,否则还是连接不上. 这样我们配置完就不会报上面的错误了,但是我们重新启动之后会报另外的问题:
意思就是elasticSearch鄙视我们当前的系统,说我们当前系统能够打开的最大文件数以及能够使用的最大内存数也都不够,需要升级到他相应的最低要求 既然这样我们就要去修改linux的配置(配合es的启动需求),该操作需要在root用户下进行,否则会提示权限不足: 1.修改linux的limits配置文件,设置内存线程和文件 该文件所在位置: /etc/security/limits.conf 添加下面的代码: *hard nofile 65536 *soft nofile 131072 *hard nproc 4096 *soft nproc 2048 这些代码需要写在#End of file之前,否则这些代码是不会生效的,如果你是云服务器的话,那么你还需要将#End of file后面的参数也修改以下,否则之后启动还是会报相同的错误
之后我们中心刷新一下该文件,使其生效. source /etc/security/limits.conf
2.修改linux的sysctl配置文件,配置系统使用内存 文件所在位置: /etc/sysctl.conf 添加下面的代码: vm.max_map_count=655360 fs.file-max=655360 之后保存退出之后,我们就需要让该配置生效 sysctl -p
这样配置就已经生效了. 之后我们便可以重新用es用户去启动elasticSearch了,可以发现已经启动成功了:
虽然他显示的发布地址是通过我们的内网ip地址
,但是我们通过浏览器访问的时候还是直接通过公网ip:9200访问即可.
这样我们的elasticSearch就算是安装并且启动成功了.
码字不易,如果觉得对你有帮助的话,可以关注我!!!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。