ElasticSearch概述
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful接口。它可以近乎实时的存储、检索数据;本身扩展性非常好,一个ES节点就可以认为是一个集群(默认支持集群),它可以扩展到上百台服务器。ES的生产环境至少在8GB以上
Lucene和ES的关系
- Lucene只是一个库,必须使用Java作为开发语言将他集成到应用中,使用起来十分复杂
- ElasticSearch也是使用Java开发并使用Lucene作为其核心来实现所有索引和搜索功能,它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,让全文搜索变得简单
ES和Mysql对比理解
MySQL | Elastic Search |
---|---|
Database | Index |
Table | Type |
Row | Document |
Column | Field |
Schema | Mapping |
Index | Everything is indexed |
SQL | Query DSL |
SELECT* FORM table… | GET http://… |
UPDATE table SET… | PUT http://… |
- 关系型数据库中schema定义了表,字段以及表和字段之间的关系。与之对应的,在ES中:Mapping定义索引下的Type的字段处理规则,即索引如何建立、索引类型、是否保存原始索引json文档、是否需要分词处理、如何进行分词处理等等
- Mysql主要用途:存储数据,用来完成强一致性,保证ACID的数据,逻辑性事务性操作
- Redis主要用途:存储数据,做缓存
- ES主要用途:存储数据,提供全文检索
ES核心概念
- 索引Index:ES中的索引类似关系型数据库中的数据库,里面存放用户文档数据,因为ES是封装的Lucene,所以底层还是由Lucene的一个或者多个索引组成,数据的增删改查也是由底层的Lucene完成,ES中的分片或副本实际上就是一个Lucene索引
- 文档Document:文档是ES中存储数据的主体,ES中所有操作都是建立在文档的基础上的,每个文档都是由各种Field组成,每一个Field有一个名称和一个或多个值构成,文档展示给用户就是一个JSON对象
- 类型Type:ES中Type是一种逻辑上的概念,类似关系型数据库中的表,每个文档都属于某一种类型,如果没有定义类型会有默认值,ES每个索引可以包含多种类型。现在ES5.0之后,就不推荐使用Type了,全部叫_doc
- 映射Mapping:映射类似关系型数据库中的schema,用于定义field的属性,如字段类型、是否分词等,这里有一点和关系型数据库不同的是ES会在用户没有定义字段属性的情况下,自动嗅探该字段的类型进行自动识别
- 集群Cluster:多个ES节点工作在一起组成一个集群,ES对于集群的支持几乎是无缝的
- 节点Node:一个ES实例就是一个节点,说的再简单点,一台部署了ES服务器的机器就是一个节点,同时一台机器如果硬件资源允许也可以同时启动多个ES实例,ES中每个节点都和集群(如果是多个节点的集群)中的其他节点相互通信,了解多有文档存储位置并能转发用户的请求到对应的数据节点上
- 分片Shard:因为ES是分布式架构,类似有HDFS的存储方式,所以数据被打散存储在集群的多个节点上,一个分片实际上就是底层Lucene的一个索引,这里说分片指的是ES中的主分片,分片的方式是ES自动完成,用户可以指定分片的数量,主分片一旦指定就不能修改,因为ES打散数据的方式和索引创建时指定的主分片数量有关,后期改变会导致分片中的数据不可搜索