1. Elasticsearch简介
1.1. 介绍
ES=elaticsearch简写, Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。
Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
1.2. 解决的痛点
- 检索相关数据;
- 返回统计结果;
- 速度要快。
1.3. 核心概念
A. Cluster:集群
ES可以作为一个独立的单个搜索服务器。不过,为了处理大型数据集,实现容错和高可用性,ES可以运行在许多互相合作的服务器上。这些服务器的集合称为集群。
B. Node:节点 形成集群的每个服务器称为节点。
C. Shard:分片 当有大量的文档时,由于内存的限制、磁盘处理能力不足、无法足够快的响应客户端的请求等,一个节点可能不够。这种情况下,数据可以分为较小的分片。每个分片放到不同的服务器上。
当你查询的索引分布在多个分片上时,ES会把查询发送给每个相关的分片,并将结果组合在一起,而应用程序并不知道分片的存在。即:这个过程对用户来说是透明的。
D. Replia:副本 为提高查询吞吐量或实现高可用性,可以使用分片副本。
副本是一个分片的精确复制,每个分片可以有零个或多个副本。ES中可以有许多相同的分片,其中之一被选择更改索引操作,这种特殊的分片称为主分片。
当主分片丢失时,如:该分片所在的数据不可用时,集群将副本提升为新的主分片。
E. 全文检索 全文检索就是对一篇文章进行索引,可以根据关键字搜索,类似于mysql里的like语句。
全文索引就是把内容根据词的意义进行分词,然后分别创建索引,例如”你们的激情是因为什么事情来的” 可能会被分词成:“你们“,”激情“,“什么事情“,”来“ 等token,这样当你搜索“你们” 或者 “激情” 都会把这句搜出来。
1.4. 安装
1、Elasticsearch基于Java开发,所以我们需要先安装JDK环境,jdk>=1.8
2、安装Elasticsearch
2. JDK环境安装
2.1. 下载jdk
这里放出一个jdk8的下载地址:
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
2.2. 解压
将其解压到/usr/local/jdk
就好:
2.3. 配置环境变量
A. 然后就是配置环境变量了:
vi /etc/profile
在其文件尾添加如下:
JAVA_HOME=/usr/local/jdk
JRE_HOME=$JAVA_HOME/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export JAVA_HOME PATH JRE_HOME
Tips:如果你解压位置和我的不一样,那么必须要修改JAVA_HOME的值!
B. 刷新全局变量
source /etc/profile
C. 验证
java -version
至此,JDK环境安装完毕!
3. ElasticSearch安装
3.1. 下载压缩包
官网下载地址:
https://www.elastic.co/cn/downloads/elasticsearch
我们这里下载Linux的版本:
Tips:你可以先下载到本地电脑上,然后在上传到Linux环境的系统(服务器),或者直接在Linux环境下用wget等下载工具下载也可。
我这里先下载到了Windows,然后通过rz上传到linux:
3.2. 解压安装
方便起见,我们这里也解压到/usr/local目录下:
参考解压命令:
# 仅供参考
tar zxvf elasticsearch-7.5.2-linux-x86_64.tar.gz -C /usr/local
3.3. 配置
ES的默认配置文件是在:
config/elasticsearch.yml
内存配置文件:
config/jvm.options
我们这里配置下内存文件:
vi config/jvm.options
:wq
保存退出
待会我们还会修改很多配置项才能运行成功。
3.4. 创建新用户和用户组
A. 创建
useradd es -U # 创建同名的用户和用户组
B. 分配
将/usr/local/elasticsearch-7.5.2
目录分配给es用户/组
参考命令,具体目录根据自己修改:
chown es:es elasticsearch-7.5.2/ -R
结果:
3.5. 启动
A. 切换到刚才创建的用户
su es
B. 启动
bin/elasticsearch # 如果加-d则为后台守护进程启动
启动成功:
演示的时候还算幸运,没出现诸如网上说的各种错误。
启动时如果你像我这样,卡在这里,是正常的(因为我们没后台守护启动):
然后另起一个shell(不要关闭当前卡住的这个shell),输入以下测试命令:
curl localhost:9200 # 9200是es的默认端口
如果出现如下界面,说明启动成功:
3.6. 常见启动错误
虽然我演示的时候,挺正常的,但是不排除你会出现网上流传的各种错误,所以还是总结了一下:
错误1:
错误:
max number of threads [3894] for user [elasticsearch] is too low,increase to at least [4096]
原因:
elasticsearch这个用户的最大打开线程数(3894)太低,至少增加到4096
解决:
1、查看用户最大线程打开数
ulimit -a
2、切换到root用户,编辑文件
su root # 切换到root用户
vi /etc/security/limits.conf
到文件尾,增加如下:
* soft nproc 4096
* hard nproc 4096
* 表示匹配所有用户, nproc 表示配置最大打开线程数
3、退出从新登录后,再次查看,修改成功
错误2:
最大虚拟内存区域vm.max_map_count(65530)太低,至少增加到262144
解决:
在root账号下修改配置文件
vi /etc/sysctl.conf
在末尾添加配置,值大于等于实体的262144就可以
kernel.printk = 5
vm.max_map_count = 262144
添加完成后执行下面命令
sysctl -p
上面问题解决后,切换成elasticsearch账号,继续启动es。
4. 扩展
4.1. 扩展1:Php
虽然es是基于Java编写的,但它是基于HTTP协议来创建索引、更新索引、查找搜索的,所以严格意义上来讲,凡是有http访问的语言,都可以使用ES,对于PHP,ES官方有扩展包。
地址如下:
https://packagist.org/packages/elasticsearch/elasticsearch
4.2. 扩展2:php-Xunsearch
对于PHP来说,还有一种全文搜索引擎,那就是Xunsearch,但是不知道是设计缺陷还是什么,在使用xunsearch时,并不能较好的结合框架(如Laravel框架)。
因为有一点重要的,xunsearch的配置还是用过.ini文件来配置的,并不像ES那样直接传入项目名称(索引名称),就自己在内部处理,不需要通过什么.ini配置文件来处理。
但,总的来说,还是能用滴,比起ES,轻量点。