简介
Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。
但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,但Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。
Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
不过,Elasticsearch不仅仅是Lucene和全文搜索,我们还能这样去描述它:
- 分布式的实时文件存储,每个字段都被索引并可被搜索
- 分布式的实时分析搜索引擎
- 可以扩展到上百台服务器,处理PB级结构化或非结构化数据
而且,所有的这些功能被集成到一个服务里面,你的应用可以通过简单的RESTful API、各种语言的客户端甚至命令行与之交互。
上手Elasticsearch非常容易。它提供了许多合理的缺省值,并对初学者隐藏了复杂的搜索引擎理论。它开箱即用(安装即可使用),只需很少的学习既可在生产环境中使用。
Elasticsearch在Apache 2 license下许可使用,可以免费下载、使用和修改。
基本概念
集群(Cluster)
集群是由一个或多个节点(服务器)一起存储数据,并提供在所有节点联合索引和搜索功能的集合。一个集群是由唯一的一个名称(cluster.name)来确定,默认为elasticsearch,相同cluster.name的节点会组成一个集群;所以在使用过程中,同一网段的多个环境请确保cluster.name唯一,否则节点会加入到错误的集群当中;例如使用过程中开发环境和测试环境一般会在同一网段,在部署Elasticsearch集群时,集群名称必须唯一。
节点(Node)
节点是集群的组成部分,存储数据并参与数据的索引和搜索功能;在集群中,节点通过启动时默认随机生成的名称作为标识,如果不希望随机,你可以任意定义该节点名称;
节点通过配置的cluster.name发现并加入集群,启动多个相同cluster.name的节点,假设节点之间可以互相发现,则多个节点将自动组成一个集群;在一个单一的集群中,你可以增加多个节点,如果网络上没有其他启动的节点,则该节点将作为一个单节点集群。
索引(idnex)
索引是具有类似特征的文档的集合,例如客户数据、产品信息、订单信息等;索引是由一个名字标识(必须是全部小写),该名字用来进行索引、搜索、更新、删除操作指定操作那个索引。在一个集群中,可以根据需求定义多个索引。
类型(type)
在一个索引中,你可以指定多个类型;一个类型为具有一组共同的字段的文档中定义;例如博客平台,可以将所有数据存储在一个索引里面,用户信息、博客信息可以用不通的类型来区分。
文档(document)
文档是能够被索引的信息的基本单位;例如,您可以给一位客户建立一个文档、给产品建立一个文档、也可以给其它订单等建立文档;文档通过json格式存储;在索引/类型中可以存储多个文档。注意:虽然文档物理上存储在一个索引中,但实际上文档必需建立索引并分配给索引内的类型。
分片(shards)
索引可以存储大量数据,可以超过单个节点的硬件限制,例如,一个十亿文件的单个索引占用的磁盘空间1TB,可能不适合存储在单个节点的磁盘上,即使可以存储在单个节点上,也会导致搜索请求太慢。
为了解决上述问题,Elasticsearch将索引切分为多个分片,当你创建索引时,你可以指定分片数量,每个分片是独立并且全功能的,可以存储在集群中任何数据节点上;
需要分片的原因:
- 允许你水平分割/扩展您的内容量;
- 允许你分发和并行跨分片操作(可能在多个节点),从而提高性能/吞吐量;
分片在集群中的分布及搜索时文档的聚合返回完全由Elasticsearch管理,整个过程对用户透明;
副本(Replicas)
在一个Elasticsearch集群中,节点故障有可能随时发生,我们需要一个故障切换机制来防止切片/节点的不可用,为此,Elasticsearch通过复制一个或多个切片进行数据冗余,防止节点故障导致的数据丢失;
需要副本的原因:
- 保证了集群的高可用,为此,副本的存储均不会分配在同一个节点上;
- 可以提高搜索量/吞吐量,因为搜索可以并行操作所有副本;
总结
每个索引可以被切分成多个分片,每个索引也可以包含零个(没有副本)或多个副本,副本生成后,每个索引将有主分片(被复制的分片)和副本分片(主分片的拷贝),在索引创建时,可以指定主分片及副本的个数;副本个数在索引创建后可以随时修改,但主分片个数将不能修改;默认情况下,主分片为5个,副本为1个,在一个有两台节点的集群中,默认创建一个索引,该索引将包含5个主分片和5个副本分片,总计10个分片;如果集群为单个节点,那么所有的副本将都不可用;
注意:
每个Elasticsearch分片对应Lucene的index,一个Lucene的index所能包含的最大文档数,按照LUCENE-5843,文档数应小于2,147,483,519 (= Integer.MAX_VALUE - 128) ,可以使用_cat/shards接口进行切片大小监控。