Elasticsearch来源

原文:https://mp.weixin.qq.com/s/ztVP_pFTk6Y8tD1hv2vDaQ 

简介

全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的查询字词的过程

      搜索目前以Elasticsearch和solr使用最多,而es是目前最流行的搜索技术之一。Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。Lucene™没有路由、副本、集群等概念。是一个基础的搜索api。

1.es起源

许多年前,一个刚结婚的名叫 Shay Banon 的失业开发者,跟着他的妻子去了伦敦,他的妻子在那里学习厨师。在寻找一个赚钱的工作的时候,为了给他的妻子做一个食谱搜索引擎,他开始使用 Lucene 的一个早期版本。直接使用 Lucene 是很难的,因此 Shay 开始做一个抽象层,Java 开发者使用它可以很简单的给他们的程序添加搜索功能。他发布了他的第一个开源项目Compass。后来 Shay 获得了一份工作,主要是高性能,分布式环境下的内存数据网格。这个对于高性能,实时,分布式搜索引擎的需求尤为突出, 他决定重写 Compass,把它变为一个独立的服务并取名Elasticsearch。第一个公开版本在2010年2月发布,从此以后,Elasticsearch 已经成为了 Github 上最活跃的项目之一,他拥有超过300名 contributors(目前736名 contributors )。后来es成为一家公司,并且开始围绕 Elasticsearch 提供商业服务,并开发新的特性,Elasticsearch 将永远开源并对所有人可用。

2.合作阿里

   在 2017 杭州云栖大会上,Elasticsearch 与阿里云宣布达成战略合作,共同研发及发布阿里云上提供托管的 Elasticsearch,为中国市场提供崭新的用户体验 

3.成功上市

   2018年10月5日,美国的分布式开源大数据搜索与分析创业公司 ElasticSearch在纽交所上市,市值近50亿美元。该公司以Elasticsearch搜索产品而闻名,使用该产品的知名公司包括:思科、eBay、高盛、美国国家宇航局、微软、维基媒体基金会、三星电子和韦里逊等,下载量超过1亿人次。谷歌通过谷歌云平台提供一个完全托管的版本,国内用户赶集、苏宁易购

概念

1.索引(Index)

     相当于数据库,用于定义文档类型的存储;在同一个索引中,同一个字段只能定义一个数据类型;

2.文档类型(Type)

相当于关系表,用于描述文档中的各个字段的定义;不同的文档类型,能够存储不同的字段,服务于不同的查询请求

3.映射(mapping)

      映射(Mapping)相当于数据表的表结构。ElasticSearch中的映射(Mapping)用来定义一个文档,可以定义所包含的字段以及字段的类型、分词器及属性等等。

映射可以分为动态映射和静态映射。

(1)静态映射

在ElasticSearch中可以事先定义好映射,包含文档的各个字段及其类型等,这种方式称之为静态映射。

(2)动态映射

我们知道,在关系数据库中,需要事先创建数据库,然后在该数据库实例下创建数据表,然后才能在该数据表中插入数据。而ElasticSearch中不需要事先定义映射(Mapping),文档写入ElasticSearch时,会根据文档字段自动识别类型,这种机制称之为动态映射。

4.文档(Document)

相当于关系表的数据行,存储数据的载体,包含一个或多个存有数据的字段。

5.节点(node)

    单个es服务实例成为节点,即某一台部署服务的机器,通常说3节点代表3台机器,多个节点组成集群。节点分为主节点、数据节点、客户端节点,默认情况既是主节点又是数据节点。

6.cluster(集群)

   代表一个集群,集群中有多个节点,其中有一个为主节点,默认这个主节点是可以通过选举产生的,配置方式可指定哪些节点主节点,哪些节点数据节点,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。

7.分片(shard)

     number_of_shards代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索,可提高搜索性能,当然也不是越大越好,还是要看你要存储的数据量,如果数据量大,可把分片设置大点,数据量小,可把分片设置小点,默认是5个分片,分片的数量只能在索引创建前指定,并且索引创建后不能更改。elasticsearch集群允许系统存储的数据量超过单机容量,实现这一目标引入分片策略shard。在一个索引index中,数据(document)被分片处理(sharding)到多个分片上。Elasticsearch屏蔽了管理分片的复杂性,使得多个分片呈现出一个大索引的样子。

8.副本(replica)

     number_of_replicas代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。默认是1个副本。另外为了提升访问压力过大是单机无法处理所有请求的问题,副本策略对index中的每个分片创建冗余的副本,处理查询时可以把这些副本当做主分片来对待(primary shard),此外副本策略提供了高可用和数据安全的保障,当分片所在的机器宕机,Elasticsearch可以使用其副本进行恢复,从而避免数据丢失。

9.路由(routing)

     当向Elasticsearch存放数据时,根据文档标识符_id将文档分配到多个分片上,负载均衡算法只需要实现平均即可。当取用数据时,查询所有的分片然后汇总结果,而并不必须知道数据到底存在哪个分片上。带来的问题是,在查询时,要查询所有的分片然后汇总结果,造成性能的损耗,在不乐观的情况下,有些分片的查询可能失败(failed),造成结果不准确。为了避免这个问题,引入了路由功能(routing),在存入时通过路由键将数据存入指定分片,在查询的时候可以通过相同的路由键指明在哪个分片将数据查出来。 默认情况下,索引数据的分片算法如下shard_num = hash(_routing) % num_primary_shardsrouting字段的取值,默认是_id字段或者是_parent字段,这样的取值在hash之后再与有多少个shard的数量取模,最终得到这条数据应该在被分配在那个一个shard上,也就是说默认是基于hash的分片,保证在每个shard上数据量都近似平均,这样就不会出现负载不均衡的情况,然后在检索的时候,es默认会搜索所有shard上的数据,最后在master节点上汇聚在处理后,返回最终数据。

10.网关gateway

     代表es索引快照的存储方式,es默认是先把索引存放到内存中,当内存满了时再持久化到本地硬盘,默认是1g,官方建议一个节点最大不超过32G,超过32g性能反而会下降gateway对索引快照进行存储,当这个es集群关闭再重新启动时就会从gateway中读取索引备份数据。

11.单播和多播

早期是多播方式, elasticsearch 2.0 开始默认单播的形式,多播是需要看服务器是否支持的,由于其安全性,其实现在基本的云服务(比如阿里云)是不支持多播的,所以即使你开启了多播模式,你也仅仅只能找到本机上的节点。单播模式安全,也高效,但是缺点就是如果增加了一个新的机器的话,就需要每个节点上进行配置才生效了。

12.近实时

    默认情况下,es集群中的每个shard会每隔1秒自动refresh一次,这就是我们为什么说es是近实时的搜索引擎而不是实时的,也就是说给索引插入一条数据后,我们需要等待1秒才能被搜到这条数据,这是es对写入和查询一个平衡的设置方式,这样设置既提升了es的索引写入效率同时也使得es能够近实时检索数据。

你可能感兴趣的:(Elasticsearch来源)