一、搜索功能带来的问题
目前各大网站无外乎都有搜索功能,作为很重要的功能,自然而然要求其稳定、准确。
常见的全网搜索引擎,像百度、谷歌这样的。但是除此以外,搜索技术在垂直领域也有广泛的使用,比如淘宝、京东搜索商品,万芳、知网搜索期刊,csdn中搜索问题贴。也都是基于海量数据的搜索。
海量数据的搜索如果是采用传统的关系型数据库进行
弊端:
1、 对于传统的关系性数据库对于关键词的查询,只能逐字逐行的匹配,性能非常差。
2、匹配方式不合理,比如搜索“小密手机” ,如果用like进行匹配, 根本匹配不到。但是考虑使用者的用户体验的话,除了完全匹配的记录,还应该显示一部分近似匹配的记录,至少应该匹配到“手机”。
3.某些情况下,根本用不到索引,因为like后以%开头的查询导致索引失效。
我们想让其查询效率高,搜索准确,且能进行功能更强大的模糊查询,分词查询等,显然用传统的关系型数据库是不合适的了,由此就需要一个专业的全文搜索引擎来解决这些问题。
二、ElasticSearch简介
1.ElasticSearch作为一个主流的全文搜索引擎,采取的索引技术为倒排索引的方式。我们都知道传统的关系型数据库的索引是由索引列组成的数据结构来指向真实的数据,即由记录-》单词的方式(说白了就是索引列到某一条具体的数据)。
而倒排索引保存数据的方式为:单词-》记录。
例如搜索“红海行动”
但是数据库中保存的数据如图
那么基于倒排索引的搜索引擎是如何将两者匹配上的呢?
倒排索引基于分词技术,首先每个记录保存数据时,都不会直接存入数据库。系统先会对数据进行分词,然后以倒排索引结构保存。如下:
然后等到用户搜索的时候,会把搜索的关键词也进行分词,会把“红海行动”分词分成:红海和行动两个词。
这样的话,先用红海进行匹配,得到id=1和id=2的记录编号,再用行动匹配可以迅速定位id为1,3的记录。这样就找出了1 2 3 这三条数据。
那么全文索引通常,还会根据匹配程度进行打分,显然1号记录能匹配的次数更多。所以显示的时候以评分进行排序的话,1号记录会排到最前面。而2、3号记录也可以匹配到。
2.lucene与ElasticSearch
咱们之前讲的处理分词,构建倒排索引,等等,都是这个叫lucene的做的。那么能不能说这个lucene就是搜索引擎呢?
还不能。lucene只是一个提供全文搜索功能类库的核心工具包,而真正使用它还需要一个完善的服务框架搭建起来的应用。
好比lucene是类似于jdk,而搜索引擎软件就是tomcat 的。
目前市面上流行的搜索引擎软件,主流的就两款,elasticsearch和solr,这两款都是基于lucene的搭建的,可以独立部署启动的搜索引擎服务软件。由于内核相同,所以两者除了服务器安装、部署、管理、集群以外,对于数据的操作,修改、添加、保存、查询等等都十分类似。就好像都是支持sql语言的两种数据库软件。只要学会其中一个另一个很容易上手。
从实际企业使用情况来看,elasticSearch的市场份额逐步在取代solr,国内百度、京东、新浪都是基于elasticSearch实现的搜索功能。国外就更多了 像维基百科、GitHub、Stack Overflow等等也都是基于ES的。
3.ElasticSearch的使用场景
1)为用户提供按关键字查询的全文搜索功能
2)著名的ELK框架(ElasticSearch,Logstash,Kibana),在大数据方向是一个必备的框架,是实现企业海量日志的处理分析的解决方案。
简单介绍一下这三个框架,Logstash可以将多个用户访问该网站的并发请求转化为串行请求,将这些请求的访问记录(如在某个商品停留了多少秒等用户行为信息)记录到ElasticSearch中,Kibana可以用来操作ElasticSearch,并将ElasticSearch中存储的大数据信息做成报表供人查看。这是大数据方向的重要分子,就像SSM在JavaEE中的地位一样。
三、ElasticSearch安装
1.下载安装包
Elasticsearch官网: https://www.elastic.co/products/elasticsearch
本课程选择的版本是elasticsearch-5.6.4 https://www.elastic.co/downloads/past-releases/elasticsearch-5-6-4
2.安装ElasticSearch
拷贝elasticsearch-5.6.4.rpm到/opt目录下
执行rpm -ivh 安装rpm包
3.配置ElasticSearch配置文件
1)
vim /etc/sysconfig/elasticsearch
配置JDK,修改其JAVA_HOME的路径
2)三个核心文件的配置
核心配置文件 /etc/elasticsearch/elasticsearch.yml 数据文件路径 /var/lib/elasticsearch/ 日志文件路径e /var/log/elasticsearch/elasticsearch.log |
vim /etc/elasticsearch/elasticsearch.yml
修改yml配置的注意事项:
每行必须顶格,不能有空格
“:”后面必须有一个空格
集群名称,同一集群名称必须相同
单个节点名称
网络部分 改为当前的ip地址,如果为云服务器则在这里需要配置你的内网地址 ,端口号保持默认9200就行
把bootstrap自检程序关掉,因为我们配置的不是集群环境,但ElasticSearch要求默认必须为集群环境,所以我们暂且先关掉它的自检功能
自发现配置:新节点向集群报到的主机名
4.修改linux系统的配置
为什么要修改linux配置?
默认elasticsearch是单机访问模式,就是只能自己访问自己。
但是我们之后一定会设置成允许应用服务器通过网络方式访问。这时,elasticsearch就会因为嫌弃单机版的低端默认配置而报错,甚至无法启动。
所以我们在这里就要把服务器的一些限制打开,能支持更多并发。
问题1:max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536] elasticsearch
原因:系统允许 Elasticsearch 打开的最大文件数需要修改成65536
解决:vi /etc/security/limits.conf
添加内容:
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 65536
注意:“*” 不要省略掉
问题2:max number of threads [1024] for user [judy2] likely too low, increase to at least [2048] (CentOS7.x 不用改)
原因:允许最大进程数修该成2048
解决:vi /etc/security/limits.d/90-nproc.conf
修改如下内容:
* soft nproc 1024
#修改为
* soft nproc 2048
问题3:max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144] (CentOS7.x 不用改)
原因:一个进程可以拥有的虚拟内存区域的数量。
解决:可零时提高vm.max_map_count的大小
命令:sysctl -w vm.max_map_count=262144
重启linux使linux配置生效。
启动ElasticSearch
systemctl start elasticsearch
通过ps -ef | grep elasticsearch查看进程
5.安装成功,测试。
[root@centos147 ~]# curl http://192.168.67.147:9200
得到Json串证明启动成功,或者也可以通过浏览器访问http://192.168.67.147:9200,前提是防火墙必须开放了9200端口。
6.如果启动未成功,去查看ElasticSearch的日志。
vim /var/log/elasticsearch/my-es.log
四、安装可以方便操作ElasticSearch的工具,Kibana
拷贝kibana-5.6.4-linux-x86_64.tar 到/opt下
解压缩
进入kibana主目录的config目录下
vim kibana.yml
server.host: “你本机ip”
在 kibana主目录bin目录下执行
./kibana & #后台启动
执行ps -ef
注意kibana的进程名称并不是kibana,而是
用浏览器打开
点击左边菜单DevTools
在Console中
执行 get _cluster/health
右边的结果中,status为yellow或者green。
表示es启动正常,并且与kibana连接正常。