本文已收录github:https://github.com/BigDataScholar/TheKingOfBigData,里面有我准备的大数据高频考点,Java一线大厂面试题资源,上百本免费电子书籍,作者亲绘大数据生态圈思维导图…持续更新,欢迎star!
前言
之前一直想花点时间写一篇 elasticsearch
的保姆级教程,于是,趁着年假的几天时间加上周末的一些时间,我产出了自认为算是非常详细的,基于目前最新版本的elasticsearch7.11
教程。不管是新手上路,还是秋名山老司机,都建议收藏一下,希望看完对您有所帮助!如果可以,记得一键三连!
文章目录
ElasticSearch概述
Elaticsearch,简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用 Lucene
作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。
据国际权威的数据库产品评测机构 DB Engines 的统计,在2016年1月,ElasticSearch已超过Solr等,成为排名第一的搜索引擎类应用。
为了增加学习的趣味性,我们来聊一聊 elasticsearch 的历史
历史
多年前,一个叫做Shay Banon的刚结婚不久的失业开发者,由于妻子要去伦敦学习厨师,他便跟着也去了。在他找工作的过程中,为了给妻子构建一个食谱的搜索引擎,他开始构建一个早期版本的Lucene。
直接基于Lucene工作会比较困难,所以Shay开始抽象Lucene代码以便Java程序员可以在应用中添加搜索功能。他发布了他的第一个开源项目,叫做“Compass”。
后来Shay找到一份工作,这份工作处在高性能和内存数据网格的分布式环境中,因此高性能的、实时的、分布式的搜索引擎也是理所当然需要的。然后他决定重写Compass库使其成为一个独立的服务叫做Elasticsearch。
第一个公开版本出现在2010年2月,在那之后Elasticsearch已经成为Github上最受欢迎的项目之一,代码贡献者超过300人。一家主营Elasticsearch的公司就此成立,他们一边提供商业支持一边开发新功能,不过 Elasticsearch 将永远开源且对所有人可用。
Shay的妻子依旧等待着她的食谱搜索……
ES 和 solr 的差别
学习 ES,我们免不了需要跟 solr 进行对比学习!下面我们分别来看看,它们之间具体的差别在哪里:
Elasticsearch 简介
Elasticsearch 是一个实时分布式搜索和分析引擎。它让你以前所未有的速度处理大数据成为可能。
它用于全文搜索、结构化搜索、分析以及将这三者混合使用:
维基百科使用Elasticsearch提供全文搜索并高亮关键字,以及输入 实时搜索(search-asyou-type)和 搜索纠错(did-you-mean)等搜索建议功能。
英国卫报使用Elasticsearch结合用户日志和社交网络数据提供给他们的编辑以实时的反馈,以便及时了解公众对新发表的文章的回应。
StackOverflow结合全文搜索与地理位置查询,以及more-like-this功能来找到相关的问题和答案。
Github使用Elasticsearch检索1300亿行的代码。
但是 Elasticsearch 不仅用于大型企业,它还让像DataDog 以及 Klout 这样的创业公司将最初的想法变成可扩展的解决方案。
Elasticsearch可以在你的笔记本上运行,也可以在数以百计的服务器上处理PB级别的数据 。
Elasticsearch 是一个基于 Apache Lucene™ 的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库
但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的
Elasticsearch也使用Java开发并使用 Lucene 作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单
Solr 简介
Solr 是 Apache 下的一个顶级开源项目,采用Java开发,它是基于 Lucene 的全文搜索服务器。Solr提供了比 Lucene 更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
Solr可以独立运行,运行在Jetty、Tomcat 等这些Servlet容器中,Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr根据 xml 文档添加、删除、更新索引。Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr 返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。
Solr是基于 lucene 开发企业级搜索服务器,实际上就是封装了lucene。
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的文件,生成索引;也可以通过提出查找请求,并得到返回结果。
Lucene简介
Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。
Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。
Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。
Lucene是一个全文检索引擎的架构。那什么是全文搜索引擎?
全文搜索引擎是名副其实的搜索引擎,国外具代表性的有Google、Fast/AllTheWeb、AltaVista、Inktomi、Teoma、WiseNut等,国内著名的有百度(Baidu)。它们都是通过从互联网上提取的各个网站的信息(以网页文字为主)而建立的数据库中,检索与用户查询条件匹配的相关记录,然后按一定的排列顺序将结果返回给用户,因此他们是真正的搜索引擎。
从搜索结果来源的角度,全文搜索引擎又可细分为两种,一种是拥有自己的检索程序(Indexer),俗称“蜘蛛”(Spider)程序或“机器人”(Robot)程序,并自建网页数据库,搜索结果直接从自身的数据库中调用,如上面提到的7家引擎;另一种则是租用其他引擎的数据库,并按自定的格式排列搜索结果,如 Lycos 引擎。
Elasticsearch和Solr比较
ElasticSearch vs Solr 总结
1、es基本是开箱即用,非常简单。Solr安装略微复杂一丢丢!
2、Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能。
3、Solr 支持更多格式的数据,比如JSON、XML、CSV,而 Elasticsearch 仅支持json文件格式
4、Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供,例如图形化界面需要kibana友好支撑
5、Solr 查询快,但更新索引时慢(即插入删除慢),用于电商等查询多的应用;
- ES建立索引快(即查询慢),即实时性查询快,用于facebook新浪等搜索。
- Solr 是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用。
6、Solr 比较成熟,有一个更大,更成熟的用户、开发和贡献者社区,而 Elasticsearch 相对开发维护者较少,更新太快,学习使用成本较高。
所以如果我们在做技术选型的时候,具体选择哪一项技术,还需要根据不同的场景来进行结合选择。
哈哈哈,好像跑题了,下面我们就正式进入到 elasticsearch 的学习中!
安装elasticsearch
我们首先来到 es 的官网,根据自己不同的操作系统,点击即可下载最新版本的产品,目前最新版本是Elasticsearch 7.11
官网地址:https://www.elastic.co/cn/start
Kibana 是一个免费且开放的用户平台,能够让我们对 Elasticsearch 数据进行可视化,这里我们也一并将其下载到本地
上传安装包到linux并解压
我的习惯是将所有的软件包放到/export/software
目录下,解压后的目录是/export/servers
[root@node01 software]# tar -zxvf elasticsearch-7.11.0-linux-x86_64.tar.gz -C ../servers/
目录结构
解压完毕之后,我们先来熟悉es的目录结构
[root@node01 elasticsearch-7.11.0]# ll /export/servers/elasticsearch-7.11.0
总用量 556
drwxr-xr-x. 2 esuser esuser 4096 2月 9 06:48 bin
drwxr-xr-x. 3 esuser esuser 199 2月 13 14:44 config
drwxr-xr-x. 3 esuser esuser 19 2月 13 14:15 data
drwxr-xr-x. 9 esuser esuser 107 2月 9 06:48 jdk
drwxr-xr-x. 3 esuser esuser 4096 2月 9 06:48 lib
-rw-r--r--. 1 esuser esuser 3860 2月 9 06:41 LICENSE.txt
drwxr-xr-x. 2 esuser esuser 6 2月 13 14:47 logs
drwxr-xr-x. 57 esuser esuser 4096 2月 9 06:49 modules
-rw-r--r--. 1 esuser esuser 544318 2月 9 06:46 NOTICE.txt
drwxr-xr-x. 2 esuser esuser 6 2月 9 06:45 plugins
-rw-r--r--. 1 esuser esuser 7263 2月 9 06:41 README.asciidoc
其中我们常用的目录有:
- bin:可执行文件在里面,运行es的命令就在这个里面,包含了一些脚本文件等
- config:配置文件目录
- JDK:java环境
- lib:依赖的jar,类库
- logs:日志文件
- modules:es相关的模块
- plugins:可以自己开发的插件
- data:这个目录没有,自己新建一下,后面要用 -> mkdir data,这个作为索引目录
修改配置文件
熟悉完es的目录,在启动es前,我们还需要修改一些配置文件
核心配置文件 elasticearch.yml
[root@node01 elasticsearch-7.11.0]# vim config/elasticsearch.yml
- 修改集群名称
- 修改当前的 es 节点名称
- 修改data数据保存地址和日志数据保存地址
- 绑定 es 网络 ip
- 集群节点修改为之前的节点名称
具体位置如下图所示:
修改 jvm 参数
因为 Elasticsearch 是用 Java 语言开发的,所以我们在配置环节一定少不了修改 jvm 的参数
[root@node01 elasticsearch-7.11.0]# vim config/jvm.options
根据自己当前操作系统的不同配置,设置不同的大小即可
添加用户
比较有意思的一点是,es不允许使用 root 来操作 es,需要我们添加用户,具体的命令如下:
# 1. 创建elsearch用户组及elsearch用户:
groupadd elsearch
useradd elsearch -g elsearch
passwd elsearch# 接下来会输入两次密码
# new password
# retype passwd
# 2. 切换到elsearch用户再启动
su elsearch
启动es
修改完上面2个配置文件,我们切换到bin
目录下,通过./elasticsearch
启动es
不出意外,应该会报如下错误:
ERROR: [3] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
[2]: max number of threads [3795] for user [esuser] is too low, increase to at least [4096]
我们只需要将最大的线程数设置大一些即可
我们切换回到root
目录
- 修改
/etc/security/limits.conf
文件
添加以下内容
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
如下图所示:
- 修改 /etc/sysctl.conf 增加
vm.max_map_count=262145
修改完成之后,使用sysctl -p
命令刷新一下,再次切换到 esuser
进行启动即可。
记得将防火墙关闭或者将9200端口打开,否则就会出现启动成功,页面无法访问的情况
启动与暂停
启动与暂停这里也分成2种形式
启动方式1
我们在bin
目录下直接./elasticsearch
,可以看到运行结果
然后根据自己的 ip:9200
进行访问,可以在界面上看到如下返回的结果
当前启动方式是前端启动。停止服务的话直接ctrl+c 就好了
启动方式2
同时,我们也可以后端启动
[esuser@node01 bin]$ ./elasticsearch -d
稍等片刻,再次访问地址,还是相同结果
此时,如果想关闭服务
[esuser@node01 bin]$ ps -ef|grep elasticsearch
esuser 2931 2178 0 15:58 pts/0 00:00:00 grep --color=auto elasticsearch
然后将对应的进程id kill掉即可!
接下来我们需要安装ES的图形化界面插件,也就是elasticsearch-head
,这里介绍2种方法,方法1比较麻烦,想省事的同学可以直接划到下方的方法2,利用谷歌插件进行安装,简单高效!
安装elasticsearch-head(方法1)
elasticsearch-head是一款开源软件,被托管在github上面,所以如果我们要使用它,必须先安装git,通过git获取elasticsearch-head
给大家看下这个项目,已经斩获 7.3K 的start,说明还是非常受大众欢迎
我们很容易的通过 git 将其clone到本地,然后上传到 linux 服务器上,然后解压。
需要注意的是, 运行elasticsearch-head
会用到 grunt,而 grunt 需要 npm 包管理器,所以 nodejs 是必须要安装的
安装npm
当然如果你的环境里已经安装好了npm,那则可以跳过这一步。
(1) 安装gcc
yum install gcc gcc-c++
(2) 下载node国内镜像(推荐)
wget https://npm.taobao.org/mirrors/node/v10.14.1/node-v10.14.1-linux-x64.tar.gz
(3) 解压并重命名文件夹
解压
tar -xvf node-v10.14.1-linux-x64.tar.gz
然后重命名文件夹
mv node-v10.14.1-linux-x64 node
(4) 添加环境变量
vi /etc/profile
在文件最后添加以下配置:
export NODE_HOME=/export/servers/node
export PATH=$NODE_HOME/bin:$PATH
(5) 刷新配置
source /etc/profile
(6) 验证结果
node -v
npm -v
能够正确显示版本号即说明 nodejs 环境安装成功
安装cnpm
我们上面谈到的 npm 命令是 node.js
的 npm 插件管理器,也就是下载插件安装插件的管理器。但我们在使用的时候,下载的都是国外服务器很慢会掉线,所以这一步,我们需要安装淘宝的 npm 镜像cnpm。
也非常简单,执行如下命令即可
npm install -g cnpm --registry=https://registry.npm.taobao.org
排雷:如果遇到
this is a problem related to network connectivity, behind a proxy
的异常,执行npm config set proxy null
将代理设置为空即可再重试上面的命令即可。
cnpm 正常安装完成之后呢,效果图如下:
下载依赖
现在环境都准备好了,那我们该做些什么呢?其实 GitHub 上都已经写明白了
有多种方式运行 elasticsearch-head ,我们这里需要用的就是如上所示的内置服务器的方式。
我们进入到elasticsearch-head
的目录下,执行命令,下载相关的依赖
[root@node01 elasticsearch-head]# cnpm install
命令执行完毕之后,我们可以在目录下看到多出了node_modules
目录,这就是我们下载好的依赖。
然后在该目录下执行npm run start
命令,启动 elasticsearch-head
[root@node01 elasticsearch-head]# npm run start
> elasticsearch-head@0.0.0 start /export/servers/elasticsearch-head
> grunt server
Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100
</