初识分布式搜索引擎Elasticsearch(一)

Elasticsearch是一个基于Lucene的开源分布式搜索引擎,具有分布式多用户能力,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎。设计用于云计算中,能够达到实时搜索、高性能计算;同时Elasticsearch的横向扩展能力非常强,不需要重启服务,基本上达到了零配置。但是目前来说相关资料很少,同时版本更新很快,bug存在,API繁多并且变化。
初识:
索引是一种数据结构,它允许对存储在其中的单词进行快速随机访问。
当需要从大量文本中快速检索文本目标时,必须首先将文本内容转换成能够进行快速搜索的格式,以建立针对文本的索引数据结构,此即为索引过程。
它通常由逻辑上互不相关的几个步骤组成。
我们说搜索组件。
索引处理就是从索引中查找单词,从而找到包含该单词的文档的过程。搜索质量主要由查准率(Precision)和查全率(Recall)两个指标进行衡量。
查准率用来衡量搜索系列过滤非相关文档的能力,而查全率用来衡量搜索系统查找相关文档的能力。
另外,除了快速搜索大量文本和搜索速度之后,搜索过程还涉及到了许多其它问题,例如单项查询、多项查询、短语查询、通配符查询、结果ranking和排序,以及友好的查询输入方式等。这些问题的解决,通常需要多个组件协作完成。
Lucene是一款高性能的、可扩展的信息检索(IR)工具库,是由Java语言开发的成熟、自由开源的搜索类库,基于Apache协议授权。
Lucene只是一个软件类库,如果要发挥Lucene的功能,还需要开发一个调用Lucene类库的应用程序。
ElasticSearch(简称ES)是一个基于Lucene构建的开源、分布式、RESTful的全文本搜索引擎。
不过,ElasticSearch却也不仅只是一个全文本搜索引擎,它还是一个分布式实时文档存储,其中每个field均是被索引的数据且可被搜索;也是一个带实时分析功能的分布式搜索引擎,并且能够扩展至数以百计的服务器存储及处理PB级的数据。
如前所述,ElasticSearch在底层利用Lucene完成其索引功能,因此其许多基本概念源于Lucene。
ElasticSearch概念和设计
索引
索引(index)是Elasticsearch存放数据的地方。索引是具有类似特性的文档的集合。类比传统的关系型数据库领域来说,索引相当于SQL中的一个数据库,或者一个数据存储方案(schema)。但与关系型数据库相比,Elasticsearch可以快速、搞笑地对索引中的数据进行全文检索,并且不需要存储原始数据。如果你熟悉MongoDB,就可以将Elasticsearch的索引理解为MongoDB中的集合。如果你熟悉CouchDB,就可以将索引理解为CouchDB中的数据库。
索引由其名称(必须为全小写字符)进行标识,并通过引用此名称完成文档的创建、搜索、更新及删除操作。一个ES集群中可以按需创建任意数目的索引。
类型(Type)
类型是索引内部的逻辑分区(category/partition),然而其意义完全取决于用户需求。因此,一个索引内部可定义一个或多个类型(type)。一般来说,类型就是为那些拥有相同的域的文档做的预定义。
例如,在索引中,可以定义一个用于存储用户数据的类型,一个存储日志数据的类型,以及一个存储评论数据的类型。文档类型可以帮助我们轻松地区分这些对象。值得注意的是,每个文档可以有不同的结构。在实际操作中,将该文档划分为不同类型对数据操作有明显的帮助。划分时需要牢记一些限制条件,其中一个限制条件就是不同的文档类型对同一字段不能设置为不同的字段类型。类比传统的关系型数据库领域来说,类型相当于“表”。
文档
文档(document)是Elasticsearch中存储的主要实体。文档由字段(行数据的列 “key/value” 的 “key”)组成,Elasticsearch允许一个字段出现多次,拥有一个名字及一个或多个值,该类字段被称为多值字段(multivalued)。每个字段对应一种类型(字符串型、数值型、日期型等)。字段类型可以是复合的,字段可以包含其他子文档或数组。字段类型在Elasticsearch中非常重要,它使得搜索引擎知道应如何执行不同的操作,如比较、排序等。幸运的是Elasticsearch可以自动确定字段类型。与关系型数据库不同,Elasticsearch的文档不需要有固定结构,不同文档可以具有不同的字段集合,而且在程序开发时不需要知道文档的字段。当然,用户也可以通过模式映射(schema mapping)定义文档结构。
初识分布式搜索引擎Elasticsearch(一)_第1张图片

集群(Cluster)
ES集群是一个或多个节点的集合,它们共同存储了整个数据集,并提供了联合索引以及可跨所有节点的搜索能力。多节点组成的集群拥有处理大型数据集并实现容错功能,它可以在一个或几个节点出现故障时保证服务的整体可用性。集群靠其独有的名称进行标识,默认名称为“elasticsearch”。节点靠其集群名称来决定加入哪个ES集群,一个节点只能属一个集群。果不考虑冗余能力等特性,仅有一个节点的ES集群一样可以实现所有的存储及搜索功能。
集群里的每个服务器则被称为一个节点(node)。可以通过索引分片(分割成更小的个体此处不懂可以看下边的分片和副本的概念)将海量数据进行分割并分布到不同节点。通过副本(索引部分的拷贝)可以实现更强的可用性和更高的性能。这些服务器被统称为一个集群(cluster),

节点(Node)
运行了单个实例的ES主机称为节点,它是集群的一个成员,可以存储数据、参与集群索引及搜索操作。类似于集群,节点靠其名称进行标识,默认为启动时自动生成的随机Marvel字符名称。用户可以按需要自定义任何希望使用的名称,但出于管理的目的,此名称应该尽可能有较好的识别性。
节点通过为其配置的ES集群名称确定其所要加入的集群。
分片
当需要存储大规模文档时,由于RAM空间、硬盘容量等的限制,仅使用一个节点是不够的。另一个问题是一个节点的计算能力达不到所期望的复杂功能的要求。在这些情况下,可以将数据切分,每部分是一个单独的ApacheLucene索引,称为分片(shard)。每个分片可以存储在集群的不同节点上。
当需要查询一个由多个分片构成的索引时,Elasticsearch将该查询发送到每个相关的分片,并将结果合并。这些过程对具体应用而言是透明的,无须知道分片的存在。
副本
为了提高查询的吞吐量或实现高可用性,可以启用分片副本功能。副本分片是对原始分片的一个精确拷贝,原始分片被称为主分片。对索引的所有修改操作都直接作用在主分片上,每个主分片可以有零个或者多个副本分片。当主分片丢失时(如存储数据的服务器不可用时),集群可以将一个副本分片提升为新的主分片。

创建索引时,用户可指定其分片的数量,默认数量为5个。
分片Shard有两种类型:primary和replica,即主shard及副本shard。
Primary shard用于文档存储,每个新的索引会自动创建5个Primary shard,当然此数量可在索引创建之前通过配置自行定义,不过,一旦创建完成,其Primary shard的数量将不可更改。
Replica shard是Primary Shard的副本,用于冗余数据及提高搜索性能。
每个Primary shard默认配置了一个Replica shard,但也可以配置多个,且其数量可动态更改。ES会根据需要自动增加或减少这些Replica shard的数量。
ES集群可由多个节点组成,各Shard分布式地存储于这些节点上。
ES可自动在节点间按需要移动shard,例如增加节点或节点故障时。简而言之,分片实现了集群的分布式存储,而副本实现了其分布式处理及冗余功能。

映射(Mapping)
ES中,所有的文档在存储之前都要首先进行分析。用户可根据需要定义如何将文本分割成token、哪些token应该被过滤掉,以及哪些文本需要进行额外处理等等。
另外,ES还提供了额外功能,例如将域中的内容按需排序。事实上,ES也能自动根据其值确定域的类型。
数据重新分布recovery
代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。
数据源river
代表es的一个数据源,也是其它存储方式(如:数据库)同步数据到es的一个方法。它是以插件方式存在的一个es服务,通过读取river中的数据并把它索引到es中,官方的river有couchDB的,RabbitMQ的,Twitter的,Wikipedia的。
索引快照gateway
代表es索引快照的存储方式,es默认是先把索引存放到内存中,当内存满了时再持久化到本地硬盘。gateway对索引快照进行存储,当这个es集群关闭再重新启动时就会从gateway中读取索引备份数据。es支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。
discovery.zen
代表es的自动发现节点机制,es是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。
Transport
代表es内部节点或集群与客户端的交互方式,默认内部是使用tcp协议进行交互,同时它支持http协议(json格式)、thrift、servlet、memcached、zeroMQ等的传输协议(通过插件方式集成)。
关于安装请看下篇博客

你可能感兴趣的:(Lucene,云计算)