Elasticsearch是什么?
Elasticsearch(简称ES)是一个基于Apache Lucene 的开源搜索引擎。Lucene是一个库,想要发挥其强大的作用,你需使用Java并要将其集成到你的应用中。Lucene本身非常复杂,你需要深入的了解检索相关知识来理解它是如何工作的。
Elasticsearch也是使用Java编写并使用Lucene来建立索引并实现搜索功能,但是它的目的是通过简单连贯的RESTful API让全文搜索变得简单并隐藏Lucene的复杂性。
Elasticsearch有几个核心概念:
(1) 接近实时(NRT):是一个接近实时的搜索平台。
(2)集群(cluster):一个集群就是由一个或多个节点组织在一起,共同持有你整个的数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识。
(3)节点(node): 一个节点是你集群中的一个服务器,是集群的一部分,存储你的数据,参与集群的索引和搜索功能。一个节点可以通过配置集群名称的方式来加入一个指定的集群。
(4)索引(index):索引是文档的集合,集群里面可以有多个索引,每个索引有很多不同的文档,每个索引的里面的字段,数据结构可能不同的。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。索引类似于关系型数据库中Database的概念。
(5) 类型(type):在一个索引中,你可以定义一种或多种类型。类型类似于关系型数据库中Table的概念。es 6.0以上的版本一个索引是没有多个type了,只有一个type。
(6)文档(document):文档是 es 的基本单元,一个索引下可以有很多文档。文档以JSON(Javascript Object Notation)格式来表示。
(7) 分片和副本(shards & replicas):一个索引可以存储超出单个节点硬件限制的大量数据。比如,一个具有上亿文档的索引占据1TB的磁盘空间,而任一个节点都没有这样大的磁盘空间;单个节点处理搜索请求,响应太慢。
为了解决这个问题,Elasticsearch提供了将索引划分成多份的能力,这些份就叫做分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。
分片之所以重要,主要有两方面的原因:允许你水平分割/扩展你的内容容量;允许你在分片(潜在地,位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量。
副本:在分片/节点失败的情况下,提供了高可用性,扩展你的搜索量/吞吐量。每个索引可以被分成多个分片,即为主分片,也可以有多个副本。主分片是在索引创建的时候设置,索引创建后不能修改主分片的数量,副本的数量任何时候都可以修改。
默认情况下,Elasticsearch中的每个索引被分片5个主分片和1个副本,索引创建的时候,如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个副本,这样的话每个索引总共就有10个分片。一个索引的多个分片可以存放在集群中的一台主机上,也可以存放在多台主机上,这取决于你的集群机器数量。主分片和副本的具体位置是由ES内在的策略所决定的。