大家知道elasticsearch(以下简称es)前,应该也接触过其他的一些数据服务,比如mysql、oracle这类关系型数据库,或者mongodb、solr这种nosql的非关系型数据库,甚至也有人使用的是lucene。现在研究es了,那就先得知道es是啥,其基本的工作原理是啥,有些啥特性。
先套用百度百科里的介绍:
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
根据这段介绍,我们可以知道这么几个关键点:
1、 es的搜索功能很强大。
2、 es支持RESTful web接口。
3、 es是基于lucene的分布式数据搜索引擎。
第1、点是我们选择es的主要原因,第2点告诉我们es可以直接通过http api 的形式进行访问调用,第3点则点出了es的核心引擎——lucene,此外es是分布式架构。
基于第3、点,如果了解过lucene的同学肯定就知道es的查询大概是怎么回事了,这个对后面如何使用es帮助非常大。
我们来在开始使用es之前,了解一些术语:
Cluster 集群
代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。
这里多说一句,在之前《菜鸟学ElasticSearch:了解一下基本的配置》里,有关于节点的类型的一些介绍,不同的节点组合意味着es的集群模式的一些变化。这一点在后面做优化的时候,可以深入了解一下。
Shards 分片
代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。
如果你之前接触mongodb这里服务,你可以近似的认为这个shards就是数据主节点的概念,但是又何mongodb有一些不一样,es的分片是可以在散布在任意一个数据节点上的。
需要注意的一点是,分片并非越多越好。因为es进行数据处理的时候,是要从各个分片上获取结果来进行处理的,过多的分片将会增加服务器的负荷。一般我们建议一个索引的分片为1~3个。另外, 分片上的数据也并非刻意无限增长,超过一定数量级的分片es服务处理能力也是有有限制的。这个最大值建议是10g 。
Replicas 副本
代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。
实际使用中,副本只是es给予我们的一个容错措施,但是真当出现重大服务器故障的时候,这个副本通常也没啥鸟用的……此外,过多的副本,也是会增加一些服务器资源的无意义的消耗。所以,这个副本的数量,一般建议是0~1个。
index索引
es的数据是按照索引分别进行存储的,如果按照sql数据库的说,你可以理解为一个索引其实就是一个数据库实例(或USER)。我们进行数据检索时,一般会从一个或者多个index里去进行检索。
type 类型
如果按照sql数据库的说,你可以理解为一个索引其实就是一个数据表(或table)。一个index下面可以有多个type,这些type中的数据的field(字段)可以不用一致。
需要注意的是,似乎在2.*以后,es在逐渐淡化type的一些使用,鼓励大家尽量分index进行数据索引。
分词(Tonkenizer,Analyzer)
这个概念实际是lucene的。简而言之就是将一组连续的字符,拆分成相对有意义的内容。
比如,“我爱北京天安门”,分词器可能会处理为“我”、 “爱”, “北京”, “天安门”。es在实际分析的时候,是将分词的结果存储起来,然后查询的时候,拿用户的给予的关键字对存储起来的词干进行匹配,然后进过分析计算后返回给我们最相关的结果。
还是以“我爱北京天安门”为例子,假设我们给予的keywor是“北京”,那么按照上面分词结果,是能够返回“我爱北京天安门”这个结果的;但是,我们如果是给的keyword是“北”,则将不会有结果返回。
如果你使用es的主要用途是进行搜索,那么需要非常关注这些内容,因为这个将决定你后面搜索的效果的好坏。
Mapping
其实就是数据结果的映射关系,定义数据的field的类型,索引的分析器方式。
熟悉sql数据库的同学,可以当这个是定义表字段的意思。
和sql数据库有些不同的是,如果数据中存在未定义的field,也是能写入到es中的,这个时候,es会根据写入的第一条数据,来自动设置这个未定义的field的mapping类型。
在实际使用es中,mapping的重要性远远大于sql里面的表字段定义,实践过程中,我们一般都会堆数据先抽取样本,定义mapping进行测试,当最后结果符合我们的要求后,才会对数据进行整体mapping 。
关于mapping必须要提到的一点是,一旦索引进行了mapping后,如果你想要调整mapping,将不会对当前已经存在的index生效。只有删除该索引(好像也可以删除index下的所有数据),使用新的索引才能生效。
以上是一些常用的术语,理解这些内容后,会帮助我们更好的使用es。