Elasticsearch的基础知识在网络上随处可见。当和“大数据”相关的名词、开源项目铺天盖地朝我们飞来的时候,Elasticsearch就像一条独特的风景线,使人眼前一亮。如果Hadoop(生态系统)比作EJB的话,那么Elasticsearch应比做Spring Framework。故此笔者仍认为有必要重新“indexing”Elasticsearch的基础知识。
特点
准实时(NRT)
Elasticsearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档可被搜索到,中间只有轻微的延迟(通常是1秒)。
极其优雅而强大的REST API
几乎所有的搜索引擎特性都能通过原生HTTP访问;查询请求和结果集为JSON格式;可以通过curl这样简单的工具进行测试/实验/调试。
无模式数据模型
允许应用设计者灵活发挥;允许对无模式的元数据任意索引;可根据索引的需要调整类型/字段。
完全分布式和高可用性
P2P方式操作主节点恢复(AdHoc),多播自动发现;适合虚拟机/云预分配环境运行;新节点加入后可横向扩展索引规模。搜索集群自动容错恢复。
高级搜索特性
全文搜索、自动完成、实时搜索分析;强大的查询DSL;多语言支持;根据大部分的查询需求,内建分词器、过滤分析。
名词
上图对类似Oracle这样的关系型数据库与Elasticsearch进行比较,把不同的名词
索引(Index)
一个索引就是一个拥有几分相似特征的文档的集合。比如说,可以有一个客户数据的索引,或一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,如果你想,可以定义任意多的索引。
分片和复制(Shard&Replica)
一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有10亿文档的索引占据1TB的磁盘空间,而单一节点都没有这么大的磁盘空间;或者单个节点响应搜索请求时太慢。
为了解决这个问题,Elasticsearch提供了将索引划分成多份的能力,这些份就叫做分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。
分片之所以重要,主要有两方面的原因:
允许水平分割/扩展你的内容容量。
允许在分片(可能位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量。
至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由Elasticsearch管理的,对作为用户的你来说,这些都是透明的。
在一个网络/云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片,或者直接叫复制。
复制之所以重要,有两个主要原因:
在分片/节点失败的情况下,提供了高可用性。为此,复制分片绝不能与原/主要(original/primary)分片放在同一节点上,这个原则非常重要。
扩展你的搜索量/吞吐量,因为搜索可以在所有的复制上并行运行。
总之,每个索引可以被划分成多个分片。一个索引也可以被复制0次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制的数量,但是你事后不能改变分片的数量。
为更直观观察这一过程,上图中是以一张图片举例的索引过程,被划分为3个分片、1份复制分片,加在一起共6个分片。
默认情况下,Elasticsearch中的每个索引被分片5个主分片和1个复制,这意味着,如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个复制分片(1个完全拷贝),这样的话每个索引总共就有10个分片。
真的么?来看看head插件截图:
类型(type)
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。
文档(document)
一个文档是一个可被索引的基础信息单元。比如,你有一个客户的文档,某产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以JSON格式来表示,而JSON是一个广泛存在于互联网的数据交互格式。
在一个索引/类型中,只要你想,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,但文档必须被索引/赋予一个类型。
字段(Fields)
字段的概念和关系型数据库的列名(字段名)概念相差无几,本文就不再啰嗦了。
映射(Mapping)
映射非常类似于静态语言中的数据类型:声明一个变量为int类型的变量,以后这个变量都只能存储int类型的数据。同样,一个number类型的映射字段只能存储number类型的数据。
同语言的数据类型相比,映射还有一些其他的含义,它不仅告诉Elasticsearch一个字段中是什么类型的值,它还告诉Elasticsearch如何索引数据以及数据是否能被搜索到。所以,当你的查询没有返回相应的数据,你的映射很有可能有问题。
查询DSL(Query DSL)
Elasticsearch提供的JSON风格特定领域语言,利用它你可以执行查询,称为查询DSL。例如:
'{
"query": {"match_all": {} },
"sort": {"balance": { "order": "desc" } }
}'
参考文献:
http://blog.csdn.net/cnweike/article/details/33736429
http://blog.csdn.net/lvhong84/article/details/23936697
http://log.medcl.net/item/2011/08/diving-into-elasticsearch-5-distributed-architecture/