elasticsearch是什么
Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。Luncene是单节点的API,ElasticSearch是分布式的。当然 Elasticsearch 并不仅仅是 Lucene 那么简单,它不仅包括了全文搜索功能,还可以进行以下工作:
- 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
- 实时分析的分布式搜索引擎。
- 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。
其实只要知道这几个关键字:分布式 实时 搜索引擎
为什么用elasticsearch
在引入elasticsearch前,我们的数据一般都存储在mysql上,所有的检索都是直接在数据库的查询,当数据库的数据量达到一定量时,数据库的检索效率就会很低,对此我们或许会有很多解决方案,比如对数据库采用分库分表(主从设置),数据库分库分表的确可以解决大部分数据量性能问题,但是同样还是会有两个问题无法避免:1分表多表的关联查询难度很大,不易实现(目前市场上主流的集中分库分表插件都没有很好的解决)2:没有建立索引的字段查询效率依旧不高 ;也有人说可以采用Hbase,的确Hbase能够支持的数据量确实大(一个表可以有数十亿行,上百万列),但是它的检索是都是行级或者range,并不支持复杂的查询,一般可以用于数据挖掘(统计报表类的比较合适); 于是基于以上场景,我们去分析elasticsearch的几个特点:分布式(多shard的方式保证数据安全,也会提供自动resharding),一般不会因为数据量有性能问题,实时:elasticsearch的检索速度非常快,接近实时(注意刚刚存储的数据) 搜索引擎:相比Hbase,es的定位就是搜索索引,支持全文检索;
总的来说ElasticSearch 产生背景是海量数据组合条件查询,毫秒级或者秒级返回数据
如何使用elasticsearch
es其实使用起来非常方便,上手很容易,我们先得了解它的几个概念:
Node 与 Cluster(节点与集群)。Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)
Index(索引)
索引是一类文档的集合 ES会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。
所以,Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index 的名字必须是小写(可以把把索引当成数据库)。
Elasticsearch索引的精髓:一切设计都是为了提高搜索的性能
type(类型)
类型可以理解成一个索引的逻辑分区,用于标识不同的文档字段信息的集合。但是由于ES还是以索引为粗粒度的单位,因此一个索引下的所有的类型,都存放在一个索引下。这也就导致不同类型相同字段名字的字段会存在类型定义冲突的问题。
在2.0之前的版本,是可以插入但是不能搜索;在2.0之后的版本直接做了插入检查,禁止字段类型冲突(据说es在6.x之后会取消type)。
document(文档)
文档是存储数据信息的基本单元,使用json来表示。
shard与replica (分片与备份)
在ES中,索引会备份成分片,每个分片是独立的lucene索引,可以完成搜索分析存储等工作。
分片的好处:
1 如果一个索引数据量很大,会造成硬件硬盘和搜索速度的瓶颈。如果分成多个分片,分片可以分摊压力。
2 分片允许用户进行水平的扩展和拆分
3 分片允许分布式的操作,可以提高搜索以及其他操作的效率
备份的好处:
1、当一个分片失败或者下线时,备份的分片可以代替工作,提高了高可用性。
2、备份的分片也可以执行搜索操作,分摊了搜索的压力。
ES默认在创建索引时会创建5个分片,这个数量可以修改。
基本概念
先说Elasticsearch的文件存储,Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式,比如下面这条用户数据:
{ "name" : "John", "sex" : "Male", "age" : 25, "birthDate": "1990/05/01", "about" : "I love to go rock climbing", "interests": [ "sports", "music" ] }
用Mysql这样的数据库存储就会容易想到建立一张User表,有balabala的字段等,在Elasticsearch里这就是一个文档,当然这个文档会属于一个User的类型,各种各样的类型存在于一个索引当中。这里有一份简易的将Elasticsearch和关系型数据术语对照表:
关系数据库⇒ 数据库⇒表⇒ 行⇒ 列(Columns)
Elasticsearch⇒索引(Index)⇒类型(type)⇒文档(Docments)⇒ 字段(Fields)
一个 Elasticsearch 集群可以包含多个索引(数据库),也就是说其中包含了很多类型(表)。这些类型中包含了很多的文档(行),然后每个文档中又包含了很多的字段(列)。Elasticsearch的交互,可以使用Java API,也可以直接使用HTTP的Restful API方式,比如我们打算插入一条记录,可以简单发送一个HTTP的请求:
PUT /megacorp/employee/1 { "name" : "John", "sex" : "Male", "age" : 25, "about" : "I love to go rock climbing", "interests": [ "sports", "music" ] }
Elasticsearch 和Solr 的区别 :