ElasticSearch介绍
1.ElasticSearch是一款基于Apache Lucene构建的开源高性能分布式开源搜索引擎。目前ElasticSearch官方的公司Elastic已经在美国纽约上市。
2.采用java编写并提供简单易用的Restful Api。
3.可以很容易横向扩展,能支持PB级别的结构化和非结构化数据处理。当存储容量不够时候可以不断的增加节点去扩容。
ElasticSearch官网地址:https://www.elastic.co
ElasticSearch中文社区地址:https://elasticsearch.cn/
ElasticSearch在DB Ranking中的排名 https://db-engines.com/en/ranking
ElasticSearch和Lucene的关系
Lucene是用java语言开发的搜索引擎的类库,提供了完整的搜索引擎,主要用于站内搜索等相关领域,它创建于1999年,在2005年称为Apache顶级开源项目。Lucene具有高性能等优点,但是它只是一款java语言开发的类库,是一个jar包,里面包含了各种建立倒排索引的方法,java开发的时候只需要导入这个jar包就可以开发了。
Lucene也有一定的局限性:
1. Lucene的复杂性以及构建搜索会有很多重复性的工作。
2. 只能基于java语言进行开发。
3. 对Lucene的学习路线非常陡峭。
4. 原生并不支持水平扩展,就是不支持分布式应用,需要另外开发。
所以Elasticsearch作者在开发的时候,基于Lucene开发了它所不支持的功能,比如增加支持分布式功能,可以水平扩展,同时降低搜索引擎全文搜索的学习难度,提供了restful接口,可以被多种编程语言调用。
ElasticSearch功能和特点
1. 提供功能强大的全文检索,结构化检索,数据分析,搜索纠错、搜索推荐,地理位置等功能。
2. 可以对对海量数据进行近实时的搜索和数据分析能力。
3. 服务和数据的高可用,水平扩展能力,可以组成大的集群,集群规模可以从单个节点扩展至数百个节点。
4. 可以支持不同的节点类型,针对日志类的应用可以支持Hot & Warm架构。
5. 采用分布式集群架构,提供海量数据的分布式存储和管理。
ElasticSearch应用场景
1.海量数据分析引擎,可以支持PB级别的数据分析,比如利用ElasticSearch提供的聚合搜索功能来从海量的日志数据中统计分析一些系统指标信息。
2.站内搜索引擎,这个应该使用最广最常用的地方。可以快速搭建站内搜索。比如维基百科,github都使用ElasticSearch做站内搜索。
3.数据仓库,可以利用ElasticSearch强大的分布式存储能力作为数据仓库是使用,为其他系统提供数据。
ElasticSearch安装
ElasticSearch是基于java语言开发的,对jdk的版本是最低需要jdk1.8。
ElasticSearch官网:https://www.elastic.co/
安装前查看下java版本
使用的是华为云的镜像
启动ES
启动后会有很多日志输出,如何判断ES启动成功呢,下面有starting ...和started字样说明就已经启动成功。
验证是否启动成功,ES默认端口是9200,在浏览器输入127.0.0.1:9200
注意说明:
Mac系统下安装会比较顺利,Centos下安装会有些问题。
ElasticSearch插件安装
1.单实例安装
elasticsearch-head插件提供了友好的web界面,同时也可以实现基本信息的查看。去github官网搜索head插件。地址:https://github.com/mobz/elasticsearch-head
使用git下载
还得下载node,去node官网下载即可,我的是mac系统。node版本要大于6.0。
安装很简单,直接下一步下一步就好。
安装完毕后查看node是否安装好,使用node -v查看
然后在npm install,不过由于npm install会被墙,要换成淘宝的仓库。
接着继续安装
提示打开127.0.0.1:9100
web页面可以打开,不过提示未连接状态。那么将elasticsearch-head插件服务先停掉,因为ES和head插件是两个独立的服务,它们之间的访问存在跨域的问题,所以需要修改跨域配置。
修改ES配置文件
修改完毕并保存后,启动ES及elasticsearch-head插件。
这时候在刷新页面,显示已经连接。
集群健康的几种状态说明:
绿色,最健康的状态,表示所有的分片包括备份都可用。
黄色,基本的分片可用,但是备份不可用(也可能是没有备份)黄色,基本的分片可用,但是备份不可用(也可能是没有备份)。
红色,部分的分片可用,表明分片有一部分损坏。此时执行查询部分数据仍然可以查到,遇到这种情况,还是赶快解决比较好红色,部分的分片可用,表明分片有一部分损坏。此时执行查询部分数据仍然可以查到,遇到这种情况,还是赶快解决比较好。
灰色,表示未连接到elasticsearch服务 .
2.分布式安装
分布式安装会建立一个集群,包含三个节点,一个master(主节点)和两个slave(从节点)。
先修改ES配置文件 config/elasticsearch.yml
接着重启ES和head插件服务,如果遇到下面问题
说明是端口占用,关闭就好。通过lsof -i:9100 和 netstat -an | grep 9100定位到对应的进程,然后kill掉,在重启就好。或者pkill -9 npm。
在通过原生ES信息查看,配置信息已经修改成功了。
slave节点的操作
分别进入目录es_slave1 和 es_slave2目录 并修改对应配置文件 并启动
es_slave2配置文件,修改完毕启动https://www.cnblogs.com/songgj/p/bin/elasticsearch -d
es_slave2配置文件,修改完毕启动https://www.cnblogs.com/songgj/p/bin/elasticsearch -d
异常情况
解决方法:https://stackoverflow.com/questions/28932178/elasticsearch-failed-to-obtain-node-lock-is-the-following-location-writable
ElasticSearch基本操作
ES的Api是基于Restful风格。
ES的Api基本格式:http://<ip>:<port>/<索引>/<类型>/<文档id>
ES的Api操作支持http动词:GET/POST/PUT/DELETE
1. 索引创建
非结构化创建:
通过ES head插件来创建
如何查看是结构化还是非结构化索引,点击信息->查看索引信息,如下
结构化索引创建:
提交请求,右侧出现acknowledged: true,然后再次查看
使用Postman来创建索引
使用postman创建索引127.0.0.1:9200/users,在body体中填写json格式数据,如下
编辑好之后点击提交按钮,如下
2. 数据插入
ES中插入分为指定文档id插入和自动产生文档id插入。文档id是一个唯一索引值来指向数据。
在postman中输入如下,这里我们指定了文档id为1,下面man后面那个1,然后点击发送。
查看head插件显示索引的信息变化
上面我们是自己指定文档id,那么下面我们使用自动产生文档id的方式,就是让ES帮我们自动产生文档id。
浏览文档数据
3. 数据修改
文档数据分为直接修改文档和脚本修改文档。
下面修改id为1的文档数据
这种属于直接修改的方式。
下面是使用脚本修改的方式。
4. 数据删除
删除文档操作
删除索引操作
5. 数据查询
查询分为简单查询,条件查询,聚合查询。
先创建一个索引book,使用put方法,127.0.0.1:9200/book
ES提供了一个叫 bulk 的 API 来进行批量操作
它用来在一个API调用中进行大量的索引更新或删除操作,这极大的提升了操作效率。
简单查询
查询文档id为1的数据
条件查询
所有的查询要指定query关键词
如果要进行关键词模糊搜索并且排序如下
聚合查询
聚合查询和Mysql中group by很像,聚合查询使用关键字aggs
下面是根据word_count字段来聚合查询
上面是单个字段聚合查询,也可多个字段进行聚合查询
6. 数据高级查询
ES数据高级查询分为:
1)子条件查询:特定字段所指特定值。子条件查询分为Query Context和
Query Context:在查询过程中,除了判断文档是否满足查询条件外,ES还会计算出一个score值来标示匹配的程度,用来判断目标文档和查询条件匹配温和度有多高。Query Context常用的查询有全文本查询(针对文本类型的数据)和字段级别的查询(针对结构化的数据,如日期,数字等)。
2)复合条件查询:以一定的逻辑组合子条件查询。
7. elasticsearch curl操作
我们还可以在命令行用使用curl命令来和elasticsearch交互。
curl命令交互格式:
下面一些案例: