admin 发表于 2016-1-23 21:01

分布式搜索引擎Elasticsearch

介绍

Elasticsearch是一个基于Lucene的开源分布式搜索引擎,具有分布式多用户能力。Elasticsearch是用java开发,提供Restful接口,能够达到实时搜索、高性能计算;同时Elasticsearch的横向扩展能力非常强,不需要重启服务,基本上达到了零配置。但是目前来说相关资料很少,同时版本更新很快,bug存在,API繁多并且变化。

概念和设计

索引

索引(index)是Elasticsearch存放数据的地方。如果你熟悉关系型数据库,就可以将索引理解为关系型数据库的一张表。但与关系型数据库相比,Elasticsearch可以快速、搞笑地对索引中的数据进行全文检索,并且不需要存储原始数据。如果你熟悉MongoDB,就可以将Elasticsearch的索引理解为MongoDB中的集合。如果你熟悉CouchDB,就可以将索引理解为CouchDB中的数据库。

文档

文档(document)是Elasticsearch中存储的主要实体。文档由字段(行数据的列)组成,Elasticsearch允许一个字段出现多次,该类字段被称为多值字段(multivalued)。每个字段对应一种类型(字符串型、数值型、日期型等)。字段类型可以是复合的,字段可以包含其他子文档或数组。字段类型在Elasticsearch中非常重要,它使得搜索引擎知道应如何执行不同的操作,如比较、排序等。幸运的是Elasticsearch可以自动确定字段类型。与关系型数据库不同,Elasticsearch的文档不需要有固定结构,不同文档可以具有不同的字段集合,而且在程序开发时不需要知道文档的字段。当然,用户也可以通过模式映射(schema mapping)定义文档结构。

文档类型

在Elasticsearch中,一个索引可以存储许多不同用途的对象。例如,基于Elasticsearch的博客可以存储文章和评论。文档类型可以帮助我们轻松地区分这些对象。值得注意的是,每个文档可以有不同的结构。在实际操作中,将该文档划分为不同类型对数据操作有明显的帮助。划分时需要牢记一些限制条件,其中一个限制条件就是不同的文档类型对同一字段不能设置为不同的字段类型。

节点与集群

Elasticsearch可以作为一个独立的搜索服务工作。然而,为了能够处理大型数据集并实现容错功能,Elasticsearch支持在多台协同工作的服务器运行。这些服务器被统称为一个集群(cluster),集群的每个服务器则被称为一个节点(node)。可以通过索引分片(分割成更小的个体)将海量数据进行分割并分布到不同节点。通过副本(索引部分的拷贝)可以实现更强的可用性和更高的性能。

分片

当需要存储大规模文档时,由于RAM空间、硬盘容量等的限制,仅使用一个节点是不够的。另一个问题是一个节点的计算能力达不到所期望的复杂功能的要求。在这些情况下,可以将数据切分,每部分是一个单独的ApacheLucene索引,称为分片(shard)。每个分片可以被存储在集群的不同节点上。当需要查询一个由多个分片构成的索引时,Elasticsearch将该查询发送到每个相关的分片,并将结果合并。这些过程对具体应用而言是透明的,无须知道分片的存在。

副本

为了提高查询的吞吐量或实现高可用性,可以启用分片副本功能。副本分片是对原始分片的一个精确拷贝,原始分片被称为主分片。对索引的所有修改操作都直接作用在主分片上,每个主分片可以有零个或者多个副本分片。当主分片丢失时(如存储数据的服务器不可用时),集群可以将一个副本分片提升为新的主分片。

安装和配置Elasticsearch集群

页: [1]
查看完整版本: 分布式搜索引擎Elasticsearch