Elasticsearch 学习之入门篇

Elasticsearch 学习之入门篇

Elasticsearch 概述

Elasticsearch 是一个基于Lucene的搜索服务器,采用Java语言编写,使用lucene构建索引,提供索引搜索功能,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。我们知道Lucene提供的功能已经很强大了,但是Lucene只是一个由Java语言编写的库,对不使用Java语言的开发人员并不友好,Elasticsearch在Lucene的基础上做了更多地改进,提供了多种语言接口。Lucene专注于底层搜索的建设,Elasticsearch专注于企业应用。

Elasticsearch的目标是让全文搜索变得更简单,开发者可以通过简单明了的RESTful API轻松地实现搜索功能,而不必去面对Lucene的复杂性。


Elasticsearch优点

  • 分布式:Elasticsearch横向拓展非常灵活,当数据规模比较小的时候可以使用小规模的集群。随着数据的增长,需要更大的容量和更高的性能,此时只需要增加更多地节点,Elasticsearch的自动发现机制会识别新增节点并重新平衡分配数据。
  • 全文检索:Apache Lucene是一个用Java编写的高性能的功能齐全的信息检索库,Elasticsearch在后台使用Lucene来提供强大的全文检索,提供任何开源产品的能力。自带多语言支持、强大的查询语言、地理位置支持、上下文感知的建议、自动完成和搜索片段。
  • 近实时搜索和分析:数据从进入Elasticsearch,可达到近实时搜索。除了搜索。Elasticsearch也可以进行聚合分析操作。
  • 高可用:高可用主要体现在容错机制上,Elasticsearch集群会自动发现新的或失败的节点,重组和重新平衡数据,确保数据是安全的和可访问的。
  • 模式自由:Elasticsearch的动态mapping机制可以自动检测数据的结构和类型,创建索引,并使数据可搜索。
  • RESTful API:Elasticsearch是API驱动。几乎任何操作都可以用一个简单的RESTful API使用JSON基于HTTP请求来实现,客户端也可使用多种编程语言。

应用场景

  1. 站内搜索:Elasticsearch在站内搜索中应用十分广泛,大部分网站尤其是网页信息量较大的网站,都会有站内全文检索这一功能,目的是为了方便用户快速检索信息。
  2. NoSQL数据库:Elasticsearch在读写性能上优于MongoDB,同时也支持地理位置查询。
  3. 日志分析:日志分析由实时日志分析平台ELK(Elasticsearch、Logstash、Kiabana)完成,能够对日志进行集中收集、存储、搜索、分析、监控以及可视化。

核心概念

集群

一个或多个安装Elasticsearch的服务器节点组织在一起就是集群,它们共同持有你整个的数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,称为cluster name,集群名称默认是“elasticsearch”。集群名称非常重要,就像一个组织的名称,具有相同集群名称的节点才会组成一个集群。集群名称可以在配置文件中指定。

节点

一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个集群名称为“elasticsearch”的集群中,这意味着如果在你的网络中启动了若干个节点,并假定它们能够相互发现彼此,他们将会自动地形成并加入到一个叫做“elasticsearch”的集群中。但是有时候这种机制并不可靠,会发生脑裂现象,往往不如在没一个节点上配置节点的名字在启动时进行被动发现来的安全稳定。

索引

一个索引就是一个拥有几分相似特征的文档的集合,索引的数据结构仍然是倒排索引。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对这个索引中的文档进行索引、搜素、更新和删除的时候,都要使用到这个名字。在一个集群中,可以定义任意多的索引。索引做动词来讲的时候表示索引数据和对数据进行索引操作。

类型

在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类或分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。

文档

一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文档。当然,也可以拥有某个订单的一个文档。文档都是JSON格式。

分片

一个索引可以存储超出单个节点硬件限制的大量数据。比如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;或单个节点处理搜索请求,响应太慢,为了解决这个问题,Elasticsearch提供了将索引划分成多份的能力,这些份就叫作分片。当你创建一个索引的时候,可以指定想要的分片数量,每个分片也是一个功能完善并且独立的索引,这个索引可以被放置到集群中的任何节点上。

分片之所以重要,主要有以下两方面原因:

  1. 允许你水平分割/扩展你的内容容量。
  2. 允许你在分片(潜在的,位于多个节点)上进行分布式、并行的操作,进而提供性能和吞吐量,至于一个分片怎样分布,他的文档怎样聚合回搜索请求,完全由Elasticsearch管理,对于用户来说,这些都是透明的。

副本

在一个网络/云的环境中,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于某种原因消失了,这种情况下,有一个故障转移机制非常有用,并且也是强烈推荐的。为此,Elasticsearch允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片,或者直接叫做副本。副本之所以重要,有以下两个原因

  1. 在分片/节点失败的情况下,保证高可用性。因为这个原因,复制分片不与主分片置于同一节点上,这一点非常重要。
  2. 扩展你的搜索量/吞吐量,因为搜索可以再所有的副本上并行运行。

总之,每个索引可以被分成多个分片。一个索引可以有一个至多个副本。一旦有了副本,每个索引就有了主分片(作为复制源的原来的分片)和副本分片(主分片的拷贝)之别。分片和副本的数量可以在索引创建时指定。在索引创建之后,可以在任何时候动态的改变副本的数量,但是事后不能改变分片的数量。


对比RDMS

Elasticsearch可以看成一个数据库,只是和关系型数据库比起来数据格式和功能不一样而已。

RDMS Elasticsearch
数据库(database) 索引(index)
表(table) 类型(type)
行(column) 文档(document)
列(schema) 字段(field)
表结构 映射(Mapping)
索引 全文索引
SQL 查询DSL
SELECT * FROM TABLE GET HTTP://
UPDATE TABLE SET PUT HTTP://
DELETE DELETE HTTP://

请注意,进入Elasticsearch的世界以后,我们讲到的某个索引下的某个类型的某个文档,和关系型数据库讲某个数据库中某张表的某条记录是等价的。

参考书籍:《从Luecene到Elasticsearch》

你可能感兴趣的:(Elasticsearch,全文检索,ES)