ElasticSearch是基于Apache Lucene的开源搜索引擎
采用Java编写,提供了简单好用的Restful 风格的API。(你不必去了解Lucene那天与搜索引擎原理相关的深层东西)
轻松的横向扩展,可支持PB级别的结构化和非结构化的数据。(即当存储容量不够的时候,可以简单粗暴地家机器解决扩展问题)
一个待业程序猿和他的厨子老婆的故事。一个没工作的外国程序猿,为了巴结他身为食堂阿姨的老婆,开发一个菜谱搜索引擎,名为compass(指南针)。后来跑偏了,菜谱到现在都没开发好,逐步扩充功能,增加了对分布式的支持,改名为ElasticSearch。
它有以下用途:
(1)海量数据分析引擎
比如每天有海量的日志数据几百TB,当你希望搜索一些指标数据的时候,就可以使用ES的聚合搜索功能,而不必花费大量的人力来设计一个新的系统。节省成本,并有不错的使用效果。
(2)站内搜索引擎
当你需要构建一个站内搜索的时候,不需要花费大量的精力去开发,直接进行一些继承和简单的封装即可使用。
(3)数据仓库
由于ES巨大的存储能力,另外他还可以作为数据仓库使用。存储PB级别的结构化和非结构化的数据。
英国卫报——实时分析公众对文章的回应
维基百科、Github——用ES实现站内实时搜索。维基百科用ES实现全文搜索、高亮关键字。Github使用ES搜索它们1000多亿行代码。
百度——实施日志监控平台。
谷歌、阿里、腾讯等
1.X 2.x 5.X 三个版本,之所以出现版本号的跳跃,是因为ElasticSearch属于ELK(ElasticSearch, Logstash, Kibana)之一,是ELK工作站的一员。原先在ES1和2的版本时,Kibana等版本号有自己的版本数字命名,十分混乱。所以为了统一,之后便统一从5开始命名。
ES5开始,支持Lucene6,性能有大幅度提升:
磁盘空间也少了一半。
构建磁盘索引时间相较于过去也少了一半。
查询性能提升了25%左右。
还支持IPv6
Elastic官网有大量的项目提供,包括前面提到的ELK。
这里我们选择Elasticsearch 5.6.8
我们将压缩包拷贝到当前用户所能访问的目录下解压。注意:一般我们解压的应用服务一般发放在/usr/local,像之前的mongo。但是恼人的ES不可以,如果你放在/usr/local,下运行脚本,如果使用
来启动。那么会报错:
如果你切换到su,使用root用户来启动,又会报出其他错误。
原因是不能使用root用户来启动。(参考:http://www.easytd.com/yichangjijin/d_16012001263.html)
所以还是把其复制在当前linux非root用户的某个目录下。
推荐:修改目录名称elasticsearch-5.XXX/ 为 elasticsearch/,方便以后升级版本升级。
我们再来看看 elasticsearch/中的文件结构如下:
bin存放ES的脚本命令。
config存放配置文件。如果要修改某个配置,原出厂配置文件一定要备份一份。
lib存放依赖的jar包等。大家可以看到Elasticsearch 5.6.8所对应的Lucene等的版本。
plugin存放第三方插件。
module是存放一些模块的目录。
下面我们通过bin中的启动脚本启动ES:
我们可以看到ES中有许多脚本命令文件,后缀名包含了windows、linux等系统脚本文件,我们可以按照自己的服务器定制。因为我这里使用的是centos7
sh那个有x权限的。
执行过程如下:
注意启动中的starting和started,说明启动好了。
这里注意,安装ES特定版本需要配备特定版本的jdk。我这里为了装ES5.6.8还特定把jdk8做了升级。
https://www.elastic.co/guide/en/elasticsearch/reference/5.6/setup.html
由于我虚拟机出现了一些问题,我后来改在本地windows环境下运行了。内存小的小伙伴也可以这样试用。
注意看,started,成功启动了ES。
日志里最后几行写明,发布地址为127.0.0.1:9200
我们通过浏览器请求127.0.0.1:9200
前面我们看到我们访问ES的服务端口9300,返回给我们一个Json。这个信息过于简单,且UI不友好。
我们需要一个像tomcat或者hadoop那样的服务端口管理查询页面。
对于ES来说,需要安装一个Head插件。
Head插件帮我们解决了一下问题:
一个可视化的界面。
实现基本信息的查看。
REST请求的模拟。
数据的基本检索。
如何安装Head插件
我们在github上搜索elasticsearch-head。
大家注意,这是一个JS项目,需要使用Node.js。所以如果你的环境没有安装node.js,请先安装好。
然后,大家把head压缩包解压,从bash进入解压后的head的根目录:
然后通过npm这个node.js的包管理工具,install这个head插件
然后就是等待,npm会将head插件进行安装。
报错不管。
然后我们启动,命令
然后我们访问浏览器localhost:9100
这里显示此时9100的head插件显示页面,显示未连接。这是因为ES和head隶属两个独立的进程,需要进行配置,将两者进行关联。
我们打开elasticsearch的根目录下的config目录,修改elasticsearch.yml文件。在最后添加2行:
http.cors.enabled: true
http.cors.allowe-origin: "*"
注意:冒号后面一定要有一个空格,这个在springboot博客中也提过了。
然后重新启动ES和Head。
这时候我们重新看:
head页面之前的未连接,现在已经变成了green
green代表ES的服务已经正常运行。
同时他还有另外两个状态:
Yellow代表集群的状态不是很好,但仍可以使用。
Red代表集群状态很差,已经出现丢失数据的情况。