elastic
什么是Elasticsearch?
Elasticsearch(简称:ES)是一个基于Apache Lucene(TM)的开源搜索引擎,使用Java编写并使用Lucene来建立索引并实现搜索的功能,其目的是通过简单连贯的RESTful API使得全文检索变得简单并隐藏Lucene的复杂性。ES不仅仅是Lucene和全文检索,它还提供:
- 分布式的实时文件存储,每个字段都被索引并且可被搜索;
- 实时分析的分布式搜索引擎;
- 可以扩展到上百台服务器,处理PB级别结构化或非结构化数据。
Elasticsearch基本概念
- 近实时(NRT):ES是一个接近实时的搜索引擎,这意味着:从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒);
- 集群(Cluster):ES允许多台服务器协同工作,每台服务器可以运行多个ES实例,单个ES实例称为一个节点(Node),一组节点构成一个集群(Cluster);
- 索引(index):索引就是拥有相似特征的文档的集合;ES会索引所有字段,经过处理后写入一个反向索引(倒排索引 Inverted Index),查询数据时,直接查询该索引。所以ES数据管理的顶层单位是索引(index),类比于关系数据库中的数据库(database)概念;【注】:每个索引有一个或者多个分片(shard),每个分片有多个副本(replica);
- 文档(document):ES中最小数据单元,index中单条记录称为文档。一个文档可以是一条用户数据、一条商品分类数据等等,通常用JSON数据结构表示;
- 类型(type):文档(document)可以分组,比如weather这个index中可以按照城市分组(北京和上海),也可以按照气候分组(晴天和雨天),这种分组称为类型(type),是虚拟的逻辑分组,用来过滤document;【注】:ES 6.x版本只允许每个index包含一个type,ES 7.x版本彻底移除了type;
补充:① 分片(shard):单台机器无法存储大量数据,ES可以将一个索引中的数据切分为多个分片,分布在多台服务器上存储。有了shard就可以横向扩展,存储更多的数据,让搜索和分析等操作分布到多台服务器上执行,提升吞吐量和性能。每个shard都是一个Lucene index;② 副本(replica):任何一个服务器随时可能出现故障或宕机,此时shard可能会丢失,因此可以通过为每个shard创建多个replica副本。replica可以在shard故障时提供备用服务,保证数据不丢失,多个replica还可以提升搜索操作的吞吐量和性能。
Elasticsearch安装
工欲善其事,必先利其器!在学习Elasticsearch之前,首先给大家介绍一下如何安装Elasticsearch!
首先,在官网https://www.elastic.co/下载Elasticsearch:
Elastic官网截图
点击右侧下载按钮,即可前往下载页面,选择Elasticsearch产品:
Elasticsearch下载页面
由于Elasticsearch是基于Java运行时平台,所以需要安装JDK环境。关于Java环境的安装,这里不做详细说明,大家可以自行前往google或者度娘安利☺!
下载得到的压缩包,我们解压后得到如下内部结构:
Elasticsearch解压内部结构
我们来依次看一下这些文件分别代表什么意思:
bin目录下面存放的是一系列可执行程序,同名.bat后缀用于window平台可执行脚本:
- elasticsearch:Elasticsearch的启动进程,Elasticsearch程序的入口;
- elasticsearch-env:用于环境变量的配置,可以在这里修改相关的环境配置;
- elasticsearch-translog:主要用于对Translog日志进行清理操作;
- elasticsearch-keystore:主要用于管理Elasticsearch的密钥;
- elasticsearch-plugin:插件安装工具;
- elasticsearch-service*:开头的几个程序是为window平台提供服务管理工具;
config目录主要存放以下配置文件信息:
- elasticsearch.yml:Elasticsearch的配置文件,使用Yaml文件格式为标准;
- jvm.options:Java虚拟机运行时环境的相关参数配置;
- log4j2.properties:日志文件相关的配置;
lib 目录是 Elasticsearch 依赖的 Jar 包和自己的 Java 本身程序所在的地方。
data 目录,数据默认存放的位置。
logs 目录,日志默认存放的位置。
modules 目录,存放 Elasticsearch 的内部功能模块。
plugins 目录,存放 Elasticsearch 的外部扩展插件。
然后,我们开始运行 Elasticsearch 程序。进入终端控制台,CD 切换到解压文件所在目录,注意目录名不要包含中文和空格。运行 Elasticsearch 主程序,如下图所示:
看到控制台输出了若干启动信息,可以看到有启动程序的环境变量,加载的模块和插件名称清单,当前监听了9200和9300端口,并且不再有新的日志输出,这个时候说明Elasticsearch已经启动完毕了,我们可以进一步验证Elasticsearch服务器是否正常。9200端口是Elasticsearch默认监听的RESTful端口,属于HTTP协议。到这里,我们一个最简单的Elasticsearch节点或者叫单实例集群就已经成功安装成功并启动了。
Elasticsearch操作实例
curl -XPORT -H 'Content-Type: application/json' http://localhost:9200/index/doc/1?pretty -d'{"name":"medcl"}'
分析该URL请求:
- http://localhost:9200/是Elasticsearch的访问地址,http协议、本机地址、9200端口
- /index/doc/1:可以理解为文档的路径,相当于是这个索引文档的唯一标识,由以下几部分组成:
- index: 索引名称,是这个文档存放的索引数据库名称;
- doc: 类型名称,是一个固定的类型,7.0 版本后移除了该概念;
- 1: 文档ID,是这个文档在这个Elasticsearch数据库中的唯一标识,可以理解为数据库中的主键
- {"name":"medcl"}: 是http请求的body参数,是一个标准的JSON文档,里面的字段名是name,字段值是medcl;
- ?pretty: 表示对请求的返回结果进行输出格式化,主要是为了让请求返回的JSON数据格式化。
往期精彩文章
Redis系列:
Redis系列(十):Redis面试系列问题(集群篇)
MySQl系列:
MySQL系列(五):精华篇