一、ElasticSearch是什么?
Elasticsearch(简称ES)是一个基于 Apache Lucene(TM) 的开源搜索引擎 , 同时也是一个分布式文档数据库.
优势
- 分布式实时文件存储,字段及字段数据均可被索引
- 可以在极短的时间内存储、搜索和分析大量的数据
- 可以扩展到上百台服务器,处理PB级结构化或非结构化数据
- ES的全文搜索特性使它成为构建搜索引擎的利器。除此之外,ES很好的支持了复杂聚合查询这一特点还使得ES非常适合拿来作数据分析使用。
缺点
- 字段类型无法修改
- 建立索引和类型写入性能较低和高硬件资源消耗(数据的写入有一个简单的 Routing 规则,可以 Route 到集群中的任意节点,所以数据写入压力是分散在整个集群的)
前边讲到ES会自动的替你建立索引,尽管这能给全文搜索以及聚合查询带来很多好处还能替你省了建索引这一麻烦事,但是这个特性也会带来一堆问题。ES需要在创建字段前要预先建立Mapping,Mapping中包含每个字段的类型信息,ES需要根据Mapping为字段建立合适的索引。由于这个Mapping的存在,ES中的字段一但建立就不能再修改类型了。
(例如,你建的数据表的某个字段忘了加全文搜索,你想临时加上,但是表已经建好并且已经有很多数据了,这时候该怎么办呢?不好意思,你只能把整个数据表删了再重建一遍!)因此,ES在数据结构灵活度上高于MySQL但远不如MongoDB。ES的缺点还不止这些,自动建立索引使得ES的写入性能也收到了影响,要明显低于MongoDB。对于同样的数据ES占用的存储空间也要明显大于MongoDB(建那么多索引能不占空间吗?),对硬件资源的消耗也是非常厉害,大数据量下64G内存+SSD基本是标配,算得上是数据库中的贵族服务了,因此如果你的老板很小气,对于ES的选用可要慎重喽!
ElasticSearch和mysql相似点:
关系型数据库(比如Mysql) | 非关系型数据库(Elasticsearch) |
数据库 (Database) | 索引 (Index) |
表 (Table) | 类型 (Type) |
数据行 (Row) | 文档 (Document) |
数据列 (Column) | 字段 (Field) |
约束 (Schema) | 映射 (Mapping) |
索引 (index)
ES中的索引类似于传统数据库中的数据库,ES中数据存储于索引中,索引是具有类似特性的文档的集合。
例如 : 一个商品索引(Folder),里面可能就存放了所有的商品数据 (document)
关系型数据库中的数据库(DataBase),等价于ES中的索引(Index)
类型 (Type)
类型类似于传统库中的表,类型是索引内部的逻辑分区,类型就是为那些拥有相同的域的文档做的预定义。
例如 : 商品分很多种类,每个种类的document的field可能不太一样(日化商品type,电器商品type,生鲜商品type )一个数据库下面有N张表(Table),等价于1个索引Index下面有N多类型(Type)
文档 (Document)
文档是Lucene索引和搜索的原子单位(es中最小数据单元),它是包含了一个或多个域的容器,基于JSON格式进行表示。
存入索引库原始的数据。比如每一条商品信息,就是一个文档
字段 (Field)
文档中的属性
1个Type由多个文档(Document)和多Field组成。
映射 (Mapping)
对应关系型数据库里的(约束)schema定义了表、每个表的字段,还有表和字段之间的关系
Mapping定义索引下的Type的字段处理规则,即索引如何建立、索引类型、是否保存原始索引JSON文档、是否压缩原始JSON文档、是否需要分词处理、如何进行分词处理等
shard(分片),replica(副本)
分片实现了集群的分布式存储,副本实现分布式处理及冗余功能。
- shard有两种类型 : primary(主) 和 replica(副)
- Replica shard 为 primary shard的副本,默认为一个,用于冗余数据及提高搜索性能
分片:将索引内部的数据分布式存储于多个节点中(索引数据分割储存),称为分片
副本:副本(Replica shard)是从主分片(primary shard)那里复制过来,为分片或节点失败时提供高可用性,副本允许用户扩展你的搜索量或吞吐量,因为搜索可以在所有副本上并行执行
分片实列场景:假设 IndexA 有2个分片,我们向 IndexA 中插入10条数据 (10个文档),那么这10条数据会尽可能平均的分为5条存储在第一个分片,剩下的5条会存储在另一个分片中。
二、ElasticSearch的特性
1.经典倒排索引
ElasticSearch实现搜索的方式–inverted index。对于正向索引forward index,我们是在文章中逐个查找关键字;而倒排索引则是利用关键词将文章串起来。例如我们在扫描第1篇文章时拆分为单个词组,其中有关键词Ada,则为Ada添加索引1,然后在扫描第2篇文章时也发现有Ada,同样将其添加到索引中。这样当我们检索Ada关键字时就可以很快地找到对应的文章。
其实像百度、谷歌等搜索引擎的原理,最核心的都是建立倒排索引!
2.分词
ES的全文搜索对中文也有很好的支持(单是中文分词器就有很多种),绝对能够满足国内大多数人的全文搜索需求。
- 搜索引擎都是对文章分词之后,再根据关键字建立倒排索引
- 搜索引擎三大过程:爬取内容、进行分词、建立反向索引