《ElasticSearch技术解析与实战-朱林》

《第一章:ElasticSearch入门》

ElasticSearch 简介:

ElasticSearch 是一个基于lucener构建的开源的,分布式的,resultful 接口全文搜索引擎

ElasticSearch 是一个分布式文档数据库。其中每个字段都是可以被索引的数据且可被搜索。

ElasticSearch 能够扩展到数以百计的服务器存储以及处理PB级的数据,它可以在很短的时间内存储,搜索,分析大量的数据。

它是实时的分布式搜索和分析引擎,它可以帮助你用非常短的时间去处理大规模数据。

ElasticSearch 是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于Restful web 接口,ElasticSearch 是用java 开发的,并作为Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。

设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

Elasticsearch的优势:

搜索的数据对象是大量的非结构化的文本数据。

搜索文本之外还需要处理分析查询,Elasticsearch 是更好的选择

文件记录量达到数十万或数百万个甚至更多。

支持大量基于交互式文本的查询。

如果需要分布式索引,则需要选择 Elasticsearch。对于需要良好可伸缩性和以及性能分布式环境,Elasticsearch 是更好的选择

需求非常灵活的全文搜索查询。

对高度相关的搜索结果的有特殊需求,但是没有可用的关系数据库可以满足。

对不同记录类型、非文本数据操作或安全事务处理的需求相对较少的情况。

如果你喜欢监控和指标,那么请使用 Elasticsearch,因为相对于 Solr,Elasticsearch 暴露了更多的关键指标

为了解决结构化数据搜索和非结构化数据搜索性能问题,就需要使用全文搜索引擎。

ElasticSearch扩展方案:

垂直扩展/向上扩展 ElasticSearch可以通过购买性能更强的服务器来完成,称为垂直扩展或者向上扩展。
水平扩展

增加更多的服务器来完成,称为水平扩展或者向外扩展。

优点:

1.横向可扩展性:只需要增加一台服务器,做一点儿配置,启动ElasticSearch进程就可以并入集群。

2.分片机制提供更好的分布性:同一个索引分成多个分片sharding,类似hdfs块的机制,分而治之的方式可提升处理效率。

3.高可用:提供复制replica机制,一个分片可以设置多个复制,使得某台服务器在宕机的情况下,集群仍旧可以照常运行,并会把服务器宕机丢失
的数据信息复制恢复到其他可用节点上。

4.使用简单:只需要一个命令就可以下载文件,很快就能搭建一个站内搜索引擎。

总结: 推荐水平扩展,通过向集群中添加更多的节点来分担负载,增加可靠性。
Lucene 简介:

Lucene 是Apache 软件基金会中一个开源代码的全文搜索引擎工具包,是一个全文搜索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene 的目的是为软件开发人员提供一个简单易用的工具包,以方便在目标系统中实现全文搜索的功能,或者是以此为基础建立起完整的全文搜索引擎。

Lucene: 实现时,Lucene 将上面三列分别作为词典文件(Term Dicitionary),频率文件(frequencies),位置文件(positions)保存。其中词典文件不仅保存了每个关键词,还保留了指向频率文件和位置文件的指针,通过指针可以找到该关键字的频率信息和位置信息。Lucene使用了field的概念,用于表达信息所在位置,在建索引中,该field信息也记录在词典文件中,每个关键词都有一个field信息,因为每个关键字一定属于一个或多个field。

压缩算法:为了减小索引文件的大小,Lucene对索引还使用了压缩技术。

ES原理

它的工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反

馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。

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

正排(正向)索引

举例:一张数据库表,里面字段有id,content,create_time。往里面插入数据,通过id可以很快查询到一条记录,之所以快就是因为将id设置为主键,同时生成主键索引,通过主键索引快速关联到该记录。

此时如果需要匹配某个词汇,就需要使用like,每条数据都要遍历,所以查询效率很低。

Lucene

倒排索引:

倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因此称为倒排索引inverted index。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件。


倒排索引的索引对象是文档或者文档集合中的单词,用来存储这些单词在一个文档或者一组文档中的存储位置,是对文档或者文档集合的一种最常用的索引机制。

搜索引擎关键步骤就是建立倒排索引,倒排索引一般表示为一个关键词,然后是它的出现频率,位置。

ElasticSearch术语及概念:

索引词term: ElasticSearch索引词term 是一个能够被索引的精确值,foo,Foo,FOO 几个词是不同的索引词,索引词term 是可以通过term 查询进行准确的查找。
文本text: 文本是一段普通的非结构化文字,通常,文本会被分析成一个个的索引词,存储在ES的索引库中。为了能够让文本能够进行搜索,文本字段需要事先进行分析;当对文本中的关键词进行查询的时候,搜索引擎应该根据搜索条件搜索出原文本。
分析analysis: 分析是将文本转换为索引词的过程,分析的结果依赖于分词器。索引词存储在ES索引库中
集群cluster:

集群由一个或多个节点组成,对外提供服务,对外提供索引和搜索功能。

在所有节点,一个集群有一个唯一的名称默认为"Elasticsearch"。此名称是很重要的,每个节点只能是集群的一部分,当该节点被设置为相同的集群名称时,就会自动加入集群。

当需要有多个集群的时候,要确保每个集群的名称不能重复,否则节点可能会加入错误的集群。

你可以拥有多个独立的集群,每个集群都有不同的集群名称。

注意:一个节点只能加入一个集群。

节点node :

一个节点时一个逻辑上独立的服务,它是集群的一部分,可以存储数据,并参与集群的索引和搜索功能。

就像集群一样,节点也有唯一的名字,在启动的时候分配。如果不想要默认名称,可以自定义节点名。

节点名字在管理中很重要,在网络中ElasticSearch 集群通过节点名称进行管理和通信。一个节点可以被配置加入一个特定的集群。

默认情况下,每个节点会加入名为ElasticSearch集群中,这意味着如果在网络上启动多个节点,如果网络畅通,他们能够发现并自动加入一个名为ElasticSearch的集群中。

在一个集群中,你可以拥有多个节点,当网络没有集群运行的时候,只要启动任何一个节点,这个节点会默认生成一个新的集群,这个集群会有一个节点。

路由routing: 当存储一个文档的时候,它会存储在唯一的主分片中,具体哪个分片是通过散列值进行选择。默认情况下,这个值是由文档的ID生成,如果文档有一个指定的父级文档,则从父级文档ID中生成,该值可以在存储文档的时候进行修改。
分片shard:

分片是单个Lucene实例,这是ElasticSearch管理的比较底层的功能。索引是指向主分片和副本分片的逻辑空间。对于使用,只需要指定分片的数量,其他不需要。在开发过程中,我们对应的对象都是索引,ElasticSearch会自动管理集群中的所有的分片,当发生故障,ElasticSearch会把分片移动到不同的节点或者添加新的节点。

一个索引可以存储很大的数据,这些空间可以超过一个节点的物理存储的限制。举例:十亿个文档占用磁盘空间为1TB,仅仅从单个节点搜索可能会很慢,还有一台物理机器也不一定能存储这么多的数据,为了解决这一问题,ElasticSearch 将索引分解成多个分片。当你创建一个索引,你可以简单的定义你想要的分片数量。每个分片本身是一个全功能的,独立的单元,可以托管在集群中的任何节点。

主分片

primary shard:

每个文档都存储在一个分片中,当你存储一个文档的时候,系统会首先存储在主分片中,然后会复制到不同的副本中。

默认情况下,一个索引有5个主分片。你可以实现指定分片的数量,当分片一旦建立,则不能修改。

副本分片replica shard:

 每一个分片有零个或多个副本,副本主要是主分片的复制。有两个目的:

 1. 增加高可用:当节点失败的时候不受影响。当主分片失败的时候,可以从副本分片中选择一个作为主分片。【一个复制的分片不会存储在同一个节点中】

 2.提高性能:当查询的时候可以到主分片或副本分片中进行查询。默认情况下,一个主分片配有一个副本,但副本的数量可以在后面动态的配置添加。副本分片必须部署在不同的节点上,不能部署在和主分片相同的节点上。

分片主要有两个很重要的原因:

1.允许水平分割扩展数据

2.允许分配和并行操作,从而提高性能和吞吐量。

复制分片replica:

replica shard。每一个分片有0 或多个副本。副本主要是主分片的复制,复制是解决的是单点问题。当网络中的某个节点出现问题时,复制可以对故障进行转移,保证系统的高可用。所以,ES 允许你创建一个或多个拷贝,你的索引分片就形成了所谓的副本/副本分片。有两个目的:
 

1. 增加高可用:当节点失败的时候不受影响。当主分片失败的时候,可以从副本分片中选择一个作为主分片。注意:一个复制的分片不会存储在同一个节点中。

2.它允许你扩展搜索量,提高并发量,因为搜索可以在所有副本上并行执行。

每个索引可以拆分成多个分片,索引可以复制零个或多个分片,一旦复制,每个索引就有了主分片和副本分片。分片的数量和副本的数量可以在创建索引时定义。当创建索引后,你可以随便改变副本的数量,但你不能改变分片的数量。

默认情况下,每个索引分配5个分片和一个副本,这意味着你的集群节点至少要有两个节点,你将拥有5个主要的分片和5个副本分共10个分片。

索引index:

ES 里的 Index 可以看做一个库。

包含一堆有相似结构的文档数据,一个index 就代表了一类类似的或者相同的document。

注意:索引名称必须小写,不能用下划线开头,不能包含逗号。

类型type:

每个索引都可以由一个或多个type,type 是index中的一个逻辑数据分类,一个type下的document ,都有相同的field,或许会有轻微的field 不同。

注意:type 名称可以 是大写或者小写,但不能用下划线开头,不能包含逗号。Elasticsearch 6.X 中,一个 index 下已经只能包含一个type,Elasticsearch 7.X 中, Type 的概念已经被删除了。

文档document 

Elasticsearch 是面向文档型数据库,一条数据在这里就是一个文档。

文档时存储在ElasticSearch中的一个json格式的字符串。类似在关系数据库中的一行数据记录。每个存储在索引中的一个文档都有一个类型和一个id,每个文档都是一个json对象,存储了0个或多个字段,或者键值对。原始的json文档被存储在一个叫做_source的字段中。当搜索文档的时候默认返回的就是这个字段。

ElasticSearch中的最小数据单元,一个document 可以是一条客户数据,一条商品分类数据,通常用JSON 数据结构表示,每个index 下的type 中,都可以存储多个document。一个document 里面有多个field,每个field 就是一个数据字段。原始的JSON 文档被存储在一个叫做_source 的字段中,当搜索文档的时候默认返回的就是这个字段。

映射mapping: 映射像关系数据库中的表结构,每一个索引都有一个映射,它对应了索引中的每一个字段类型,以及一个索引范围内的设置,一个映射可以事先被定义,或者在第一次存储文档的时候自动识别。
字段field: 文档中包含零或多个字段,字段可以是一个简单的值(字符串,整数,日期),也可以是一个数组或对象的嵌套结构,字段类似与关系数据库中表的列。每个字段都对应一个字段类型,例如整数,字符串,对象等。字段还可以指定如何分析该字段的值。
来源字段source field: 默认情况下,你的原文档被存储在_source 这个字段中,当你查询的时候也是返回这个字段。这允许你可以从搜索结果中访问原始的对象,这个对象返回一个精准的JSON字符串,这个对象不现实索引分析后的其他任何数据。
主键ID: ID 是一个文件的唯一标识,如果在存库的时候没有提供ID,系统会自动生成一个ID,文档的index/tepe/id 必须是唯一的。
JSON:

在 elasticSearch 的接口中,大多数都是以JSON [javaScript Object notation]的进行的。JSON 是一种轻量级的数据交换格式,易于人们阅读和编写,同时也易于机器解析和生成。

JSON不但能够提高可读性,而且可以减少复杂性,JSON采用完全独立于语言的文本格式。可读性更好,减少复杂性。JSON是完全动态的,允许在JSON结构的中间改变表示数据的方式。在处理JSON格式的数据时,没有需要遵守的预定义约束。所以在同样的数据结构中,可以改变表示数据的方式,甚至可以用不同方式表示同一事物。

《ElasticSearch技术解析与实战-朱林》_第1张图片

安装ElasticSearch

下载地址:

Elasticsearch 的官方地址:欢迎来到 Elastic — Elasticsearch 和 Kibana 的开发者 | Elastic

下载地址:Past Releases of Elastic Stack Software | Elastic

安装Java: 为了运行ElasticSearch,第一步安装jdk,ElasticSearch需要Java7或者更高的版本支持。
安装ElasticSearch: ElasticSearch是Java开发的,所以JVM的环境变量JAVA_OPTS对ElasticSearch非常重要,在JAVA_OPTS中对ElasticSearch最重要的参数是-Xmx最大可以使用内存的参数,一半情况下大内存更能发挥ElasticSearch作用,建议-Xmx设置物理内存的一半 ,为了减少内存分配带来的性能损耗

你可能感兴趣的:(ElasticSearch,elasticsearch,big,data)