ElasticSearch 入门教程 - 基础篇之一

ElasticSearch 网站

ElasticSearch 介绍

ElasticSearch 概述

ElasticSearch 是基于 RESTful 标准的高扩展高可用的实时数据分析的全文搜索工具。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。ElasticSearch 是在 Lucene 的基础上用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。Elasticsearch 在云计算中,拥有实时搜索、稳定、可靠、快速、安装使用方便等优势。构建在全文检索开源软件 Lucene 之上的 Elasticsearch,不仅能对海量规模的数据完成分布式索引与检索,还能提供数据聚合分析的功能。

ElasticSearch 基础概念

  • Index - 类似于 MySQL 数据库中的 database
  • Type - 类似于 MySQL 数据库中的 table,ES 中可以在 Index 中建立 Type,通过 mapping 进行映射
  • Document - 由于 ES 存储的数据是文档类型的,一条数据对应一个文档,相当于 MySQL 数据库中的一行数据 row
  • Field - ES 中一个文档中可以有多个字段,相当于 MySQL 数据库一行可以有多列
  • Mapping - 可以理解为 MySQL 或者 Solr 中对应的 schema,只不过有些时候 ES 中的 mapping 增加了动态识别功能,实际生产环境上不建议使用,最好还是开始就制定好了对应的 schema
  • Indexed - 名义上的索引建立,MySQL 中一般会对经常使用的列增加相应的索引用于提高查询速度,而在 ES 中默认都是会加上索引的,除非特殊制定不建立索引只是进行存储用于展示,这个需要根据具体的需求和业务进行设定
  • Query DSL - 类似于 MySQL 的 SQL 语句,只不过在 ES 中是使用的 JSON 格式的查询语句,即 QueryDSL

提示

Elasticsearch 的基础概念图可以 点击这里 查看。

ElasticSearch 基本架构

elasticsearch-architecture

  • Gateway 层:ES 用来存储索引文件的一个文件系统且它支持很多类型,例如:本地磁盘、共享存储(做 Snapshot 的时候需要用到)、Hadoop 的 HDFS 分布式存储、亚马逊的 S3。它的主要职责是用来对数据进行长持久化以及整个集群重启之后可以通过 Gateway 重新恢复数据。
  • Distributed Lucene Directory:Gateway 上层就是一个 Lucene 的分布式框架,Lucene 是做检索的,但是它是一个单机的搜索引擎,像这种 ES 分布式搜索引擎系统,虽然底层用 Lucene,但是需要在每个节点上都运行 Lucene 进行相应的索引、查询以及更新,所以需要做成一个分布式的运行框架来满足业务的需要。
  • 四大模块组件:Districted Lucene Directory 之上就是一些 ES 的模块,Index Module 是索引模块,就是对数据建立索引也就是通常所说的建立一些倒排索引等;Search Module 是搜索模块,就是对数据进行查询搜索;Mapping 模块是数据映射与解析模块,就是你的数据的每个字段可以根据你建立的表结构通过 Mapping 进行映射解析,如果没有建立表结构,ES 就会根据数据类型推测数据结构之后自己生成一个 Mapping,然后都是根据这个 Mapping 进行解析数据;River 模块在 ES2.0 之后应该是被取消了,它的意思表示是第三方插件,例如可以通过一些自定义的脚本将传统的数据库(MySQL)等数据源通过格式化转换后直接同步到 ES 集群里,这个 River 大部分是自己写的,写出来的东西质量参差不齐,将这些东西集成到 ES 中会引发很多内部 Bug,严重影响了 ES 的正常应用,所以在 ES2.0 之后考虑将其去掉。
  • Discovery、Scripting:ES 四大模块组件之上有 Discovery 模块:ES 是一个集群包含很多节点,很多节点需要互相发现对方,然后组成一个集群包括选主的,这些 ES 都是用的 Discovery 模块,默认使用的是 Zen,也可是使用 EC2;ES 查询还可以支撑多种 Script 即脚本语言,包括 Mvel、JS、Python 等。
  • Transport 协议层:再上一层就是 ES 的通讯接口 Transport,支持的也比较多:Thrift、Memcached 以及 Http,默认的是 Http,JMX 就是 Java 的一个远程监控管理框架,因为 ES 是通过 Java 实现的。
  • RESTful 接口层:最上层就是 ES 暴露出来的访问接口,官方推荐的方案就是这种 RESTful 接口,直接发送 Http 请求,方便后续使用 Nginx 做代理、分发包括可能后续会做权限的管理,通过 Http 很容易做这方面的管理。如果使用 Java 客户端它是直接调用 Api,在做负载均衡以及权限管理还是不太好做。