本文介绍ElasticSearch。
1. 概述
ElasticSearch,Elastic指的是可伸缩的,Search是查询,总体上来看,核心是查询,只不过查询的功能比较强大。
在互联网中,查询的数据包括:文章,视频,图片等等。
根据数据的格式,可将数据分为
- 结构化数据(可采用关系型数据库存储,采用索引来优化)
- 非结构化数据(无法用二维表来存储,查询和存储成本较大,比如日志,一般用非关系型数据库)
- 半结构化数据(将数据和结构混合在一起,没有明显的区分,比如xml、html文档等,一般采用非关系型数据库,查询不是很容易,无法模糊配,无法匹配所有的数据)。
而ElasticSearch则是为了解决半结构化数据的查询。
Elastic Stack是一个大数据项目,包括ElasticSearch、Kibana(展示)、Beats(采集)和Logstash(采集),统称为ELK Stack,即ELK技术栈。作为Elastic Stack的核心,ElasticSearch集中存储和搜索数据,简称为ES。
ElasticSearch是一个开源的、高扩展的、分布式的、RESTFUL风格的全文搜索和数据分析引擎。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。
1.1 全文搜索
全文搜索也被称为全站搜索,比如博客文章,根据关键字检索,查找出所有匹配的文章,如果是传统数据库,搜索效率较低。
Google,百度类的网站搜索,他们都是根据网页中的关键字生成索引,我们在搜索的时候输入关键字,他们会将该关键字即索引匹配到的所有网页返回;还有常见的项目中应用日志的搜索等等。对于这个非结构化的数据文本,关系型数据库搜索不是能很好的支持。
一般传统数据库,全文搜索都实现的很鸡肋,因为一般也没人用数据库存文本字段。进行全文检索需要扫描整个表,如果数据量大的话,即使对SQL的语法优化,也收效甚微。即使建立了索引,但是维护起来也很麻烦,对于insert和update操作都会重新构建索引。
基于以上原因可以分析得出,在一些生产环境中,使用常规的搜索方式,性能是非常差的:
- 搜索的数据对象是大量的非结构化的文本数据。
- 文件记录量达到数十万或数百万个甚至更多。
- 支持大量基于交互式文本的查询。
- 需求非常灵活的全文搜索查询。
- 对高度相关的搜索结果的有特殊需求,但是没有可用的关系数据库可以满足。
- 对不同记录类型、非文本数据操作或安全事务处理的需求相对较少的情况。
为了解决结构化数据搜索和非结构化数据搜索性能问题,我们就需要专业、健壮,强大的全文搜索引擎。
这里说到的全文搜索引擎指的是目前广泛应用的主流搜索引擎。它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似通过字典中的检索字表查字的过程。
因此,需要采用有针对性的搜索引擎。
1.2 Lucene、ElasticSearch、Solr
Lucene是Apache软件基金会Jakarta项目组的一个子项目,提供了一个简单却强大的应用程序接口,能够做全文索引和搜寻。在Java开发环境里的Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。但Lucene只是一个提供全文搜索功能类库的核心工具包,而真正使用它还需要一个完善的服务框架搭建起来进行应用。
目前市面上流行的搜索引擎软件,主流的就两款:ElasticSearch和Solr。这两款都是基于Lucene搭建的,可以独立部署启动的搜索引擎服务软件。由于内核相同,所以两者除了服务器安装、部署、管理、集群以外,对于数据的操作(修改、添加、保存、查询)等都十分类似。
在使用过程中,一般都会将ElasticSearch和Solr这两个软件对比,然后进行选型。这两个搜索引擎都是流行的,先进的开源搜索引擎。它们都是围绕核心底层搜索库-Lucene构建的,但它们都是不同的,对比如下:
总体来看:
- 由于易于使用,ElasticSearch在新开发者中更受欢迎。一个下载和一个命令就可以启动一切。
- 如果除了搜索文本之外还需要处理分析查询,ElasticSearch是更好的选择。
- 如果需要分布式索引,以及需要良好的可伸缩性以及性能分布式环境,ElasticSearch是更好的选择。
- ElasticSearch在开源日志管理用例中占据主导地位,许多组织在ElasticSearch中索引它们的日志以使其可搜索。
- 如果你喜欢监控和指标,ElasticSearch是更好的选择,因为暴露了更多的关键指标。
2. ElasticSearch入门
2.1 ELasticSearch安装
进入官网免费且开放的搜索:Elasticsearch、ELK 和 Kibana 的开发者 | Elastic,点击立即体验,然后找到ElasticSearch,选择版本下载Download Elasticsearch | Elastic。这里为了简单起见,下载windows版本,方便本地配置。
ElasticSearch基于Java开发的,因此,安装包内置了JDK【可以使用自己的,也可使用内置的JDK,为了避免版本兼容问题,这里使用内置的JDK】
下载之后,解压,目录结构如下所示:
- bin:存放可执行脚本文件
- config:存放配置文件
- jdk:内置的jdk
- lib:java所需的第三方类库
- logs:日志文件
- modules:模块配置
- plugins:插件
双击bin下面的elasticsearch.bat即可运行ElasticSearch程序【由于用到C盘的某些文件写入权限,似乎可在配置文件中设置具体的文件,这里先不设置了,以管理员权限运行该脚本即可】。注意,启动成功后,cmd命令行窗口不退出,会绑定两个端口:
- 9200:浏览器访问的http协议RESTful端口;
- 9300:ElasticSearch集群间组件的通信端口;
打开浏览器输入:http://localhost:9200,显示如下界面,即表示ElasticSearch启动成功。
2.2 Postman客户端安装
通过上面端口可以发现,9200是访问ElasticSearch服务【也就是向它发送http请求的目的URL】,那么怎么发送请求呢?
如果直接通过浏览器向ElasticSearch服务器发送请求,那么需要在发送的请求中包含HTTP标准的方法,而HTTP的大部分特性仅支持GET和POST方法。所以为了能方便地进行客户端的访问,可以使用Postman软件。
Postman是一款强大的网页调试工具,提供功能强大的WebAPI和HTTP请求调试。Postman中文版能够发送任何类型的HTTP请求(GET、HEAD、POST、PUT等),不仅能够表单提交,且可以附带任意类型请求体。
为了简单起见,采用Postman工具。类似的还有apiPost、apifox、httpclient(IDEA)等
3. ElasticSearch环境
4. ElasticSearch进阶
5. ElasticSearch集成
6. ElasticSearch优化
7. 备注
参考B站《尚硅谷》。