1.1 简介
1.1.1 概述
Elaticsearch 简称为 es,es 是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB(1PB=1024TB) 级别的数据。es 也使用 java 开发并使用 Lucene 作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。
1.1.2 发展史
多年以前,有个叫 Shay Banon 的失业开发者跟随他的新婚妻子来到了伦敦,因为他妻子将在那里学习厨艺。Shay 在寻找工作的同时,开始研究还是早期版本的 Lucene,并打算为她妻子制作一个烹饪菜谱搜索引擎。直接基于 Lucene 工作会比较困难,所以 Shay 开始实现一个 Lucene 之上的抽象层,这样 Java 程序员可以很方便的为他们的应用程序添加搜索功能。于是他发布了自己的第一个开源项目 “Compass”。后来 Shay 找到了一份工作,这份工作主要围绕在高性能与分布式内存数据存储的环境中。高性能、实时、分布式搜索引擎是必不可少的需求。因此他决定重写 Compass 库,使其成为一个独立的服务器,这便是 Elasticsearch。
2010年的2月份,第一个公开版本发布了。从此之后,Elasticsearch 成为 Github 上最受欢迎的项目之一,超过300个代码贡献者。一家关于 Elasticsearch 的公司就此成立,它们不仅提供商业支持还在进行新功能的开发,但是 Elasticsearch 一定会永远向大众开放,永远开源给所有需要的人们。噢,对了,Shay 的妻子还在等待着她的菜谱搜索引擎。
1.1.3 特点
① Elasticsearch 不是什么新技术,主要是将全文检索、数据分析以及分布式技术,合并在了一起,才形成了独一无二的 ES。既可以作为一个大型分布式集群(数百台服务器)技术,处理 PB 级数据,服务大公司;也可以运行在单机上,服务小公司。
③ 对用户而言,是开箱即用的,非常简单,作为中小型的应用,直接 3 分钟部署一下 ES,就可以作为生产环境的系统来使用了,数据量不大,操作不是太复杂。
④ 数据库的功能面对很多领域是不够用的,比如全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理;Elasticsearch 作为传统数据库的一个补充,提供了数据库所不能提供的很多功能。
1.2 安装
1.2.1 安装 Elasticsearch
安装 Elasticsearch 只有一个要求,那就是需要安装 Java,最低要求 JDK 1.8。我们可以从 官网 获取最新版的 Elasticsearch。安装 Elasticsearch 很简单,只需要下载并解压对应运行平台的压缩文件。安装完毕后,在 Linux 平台使用 ./bin/elasticsearch
即可启动,在 Windows 平台使用 bin\elasticsearch.bat
即可启动。启动后访问 http://localhost:9200
即可看到 Elasticsearch 信息。
1.2.2 安装 elasticsearch-head 可视化
# 克隆 github 项目
git clone git://github.com/mobz/elasticsearch-head.git
# 进入主目录
cd elasticsearch-head
# 安装依赖,注意需要 NodeJs 环境
npm install
# 启动项目
npm run start
# 访问项目
open http://localhost:9100/
打开可视化工具之后,输入 Elasticsearch 服务地址,你以为就可以连接到服务了?天真,这里会碰到跨域问题,我们需要在 Elasticsearch 配置文件 elasticsearch.yml 中添加以下配置开启跨域。
http:
cors:
enabled: true
allow-origin: "*"
1.2.3 安装 Kibana
Kibana 是一个针对 Elasticsearch 的开源分析及可视化平台,用来搜索、查看交互存储在 Elasticsearch 索引中的数据。使用 Kibana,可以通过各种图表进行高级数据分析及展示,让海量数据更容易理解。Kibana 操作简单,基于浏览器的用户界面可以快速创建仪表板(dashboard)实时显示 Elasticsearch 查询动态。无需编码或者额外的基础架构,几分钟内就可以完成 Kibana 安装并启动 Elasticsearch 索引监测。
Kibana 的安装也异常简单,仅需两步,先去 官网 下载安装包,然后解压就可以了。需要注意的是,Kibana 的版本最好与 Elasticsearch 保持一致,否则可能会出现奇怪的问题。安装完毕后,在 Linux 平台使用 ./bin/kibana
即可启动,在 Windows 平台使用 bin/kibana.bat
即可启动。启动后访问 http://localhost:5601
即可看到 Kibana 界面。
最开始启动可能是英文的,我们可以在 Kibana 的配置文件 kibana.yml 中配置 i18n.locale: "zh-CN"
将国际化改为中文后就跟我这里一样了。以后我们的测试都会在 Kibana 中的开发工具中完成,版本不同可能开发工具的位置略有不同,使用都是相似的。之前安装的 elasticsearch-head 仅仅作为查看数据的工具。
1.3 ES 核心概念
1.3.1 名词解释
名词 | 说明 |
---|---|
近实时 | 有两层意思,一是从写入数据到数据可以被搜索到有一个大概 1 秒的小延迟;二是基于 es 执行搜索和分析可以达到秒级。 |
Cluster (集群) | 集群包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称,默认是 elasticsearch)来决定的,ES 启动就是一个只有一节点的集群 |
Node (节点) | 集群中的一个节点,节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操作的时候),默认节点会去加入一个名称为 elasticsearch 的集群,如果直接启动一堆节点,那么它们会自动组成一个 elasticsearch 集群,当然一个节点也可以组成一个 elasticsearch 集群。 |
Index (索引) | 索引包含一堆有相似结构的文档数据,一个 index 包含很多 document,一个 index 就代表了一类类似的或者相同的 document。比如说建立一个 商品索引,里面可能就存放了所有的商品数据,即所有的商品 document。 |
Type (类型) | 6.0 之前每个索引里都可以有多个 type,每一个 type 里面,都会包含一堆 document;6.0 之后每个索引里面只能有一个 type,一般使用 _doc 代替了。7.0 之后就不推荐使用,预计 8.0 之后删除 |
Document (文档) | 文档是 ES 中的最小数据单元,一个 document 可以是一条客户数据,一条商品分类数据等,通常用 JSON 表示,每个 index 下的 type 中,都可以去存储多个 document。 |
Field (字段) | Field 是 Elasticsearch 的最小单位。一个 document 里面有多个 field,每个 field 就是一个数据字段。 |
Mapping (映射) | 数据如何存放到索引对象上,需要有一个映射配置,包括:数据类型、是否存储、是否分词等。Mapping 用来定义 Document 中每个字段的类型,即所使用的分词器、是否索引等属性,非常关键等。 |
1.3.2 类比数据库
ES | MySQL |
---|---|
索引 Index | 数据库 Database |
类型 Type | 表 Table |
文档 Document | 数据行 Row |
字段 Field | 数据列 Column |
映射 Mapping | 约束 Schema |
1.3.3 ES 设计
☞ 物理设计
Elasticsearch 在后台把每个索引划分成多个分片,每分分片可以在集群中的不同服务器间迁移。一个集群至少有一个节点,而一个节点就是一个 Elasticsearch 进程,节点可以有多个索引默认的,默认情况下,每个索引由 5 个主要分片组成,而每份主要分片又有一个副本,一共 10 份分片。副本分片对于可靠性和搜索性能很有益处。
Elasticsearch 所能处理的最小单元就是分片。一个分片实际是 Lucene 的索引,即一份包含倒排索引的文件目录。一个 Elasticsearch 索引被分为多个分片。因为 Elasticsearch 是使用 Apache Lucene 作为核心的程序库实现数据索引和搜索功能。所以 Elasticsearch 的一个分片就是一个 Lucene 的索引,也就是说ー个 Elasticsearch 索引实际是由多个 Lucene 索引组成的。
☞ 逻辑设计
一个索引类型中,包含多个文档。 当我们索引一篇文档时,可以通过这样的一组顺序 索引 ☞ 类型 ☞ 文档 ID ☞ 文档
索引到某个具体的文档。Elasticsearch 通过索引、类型、与文档 ID 唯一确定了某篇文档。注意:这里的 ID 是字符串。ES 逻辑设计中有三大概念:
♞ 文档:Elasticsearch 是面向文档的,也就是说索引和搜索数据的最小单位是文档。
♞ 类型:类型是文档的逻辑容器,类似于数据库表是行记录的容器。因此,不同类型的文档,应该放入不同的类型中。
♞ 索引:索引是类型的容器,每个类型包含了一系列的文档集合。索引还存储了一些设置项,比如 refresh_interval,表示新近加入索引的文档对于搜索可见的时间间隔,即刷新频率。默认每秒更新一次,这也被称为准实时。