Elasticsearch技术解析与实战(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-29 07:41:11

点击下载

作者:朱林

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Elasticsearch技术解析与实战

Elasticsearch技术解析与实战试读:

前言

Elasticsearch是目前全球最受欢迎的全文搜索引擎。初识Elasticsearch是在2012年的一个项目中,当时Elasticsearch还是0.19.0版本,但是功能已经比较强大,只是接口稍微有点复杂。到了2015年年初,公司开发了一款日志分析产品,它实时不间断地采集用户网络中各种不同系统的日志,然后从中分析系统的安全情况、系统情况、业务情况。最初所有的数据都存储在MySQL中,随着日志的不断增加,MySQL搜索速度越来越慢。后来在更换技术架构选型的时候又想到了Elasticsearch,这个时候Elasticsearch已经是1.6.0版本了。我们对此进行了简单的测试,在上亿条的数据搜索中很多都在一秒内完成,在上亿条的数据中进行统计分析大多也是在秒级完成,它展示了强大实力。我们顺势就把Elasticsearch整合到了现在的产品中,取得了很好效果。到了2016年3月的时候,Elasticsearch发布了2.3.0版本,各方面更加成熟,我们的产品又再一次升级到这个新版本上。

Elasticsearch产品的更新变化非常快,在我们开发研究的过程中基本上找不到新版本的中文资料,目前市场上介绍Elasticsearch的中文书籍都是在版本1.0左右,甚至更早,这些书的很多内容尤其是开发接口相关的部分都已经过时,没有办法在新版本中使用。所以我们开发的过程中基本上都是研究官方文档,有时候甚至研究它的源码才能解决问题。在接口选择的时候我们在HTTP JSON接口和Java接口中做了取舍,我们当时分析HTTP JSON接口最终还是要转换成Java接口,不如直接使用Java接口,一是效率可能更高,二是在部署实施的时候减少一个端口,三是对后续的升级更有利,比如后续增加权限认证等。但这些东西都没有资料,我们基本上都是研究系统源码来克服的。在后续研究过程中,我们发现HTTP接口转换到Java接口是有规律的,所以对HTTP接口的掌握对后续Elasticsearch的开发和扩展也有很大的帮助。在持续研究的过程中,我们积累了大量经验,并想把这些经验分享给更多需要的人。后来我把这个想法给出版社的吴怡编辑做了沟通,她非常支持我们的想法,便有了这本书。

本书首先介绍Elasticsearch的相关基础知识,然后由浅入深地介绍Elasticsearch索引查询相关的知识,包括索引、映射、搜索、聚合,接着介绍Elasticsearch的集群、分词、重要的配置等高级功能,以及Elasticsearch相关的其他产品,包括告警、监控、权限管理,最后通过一个ELK示例结束本书。在写作的时候考虑到读者的接受能力,由浅入深地进行讲解,建议读者从前往后阅读。

本书主要内容包括:

第1章 “Elasticsearch入门”,介绍Elasticsearch是什么、Apache Lucene的基础知识、Elasticsearch的术语、JSON介绍、Elasticsearch的安装运行、Elasticsearch的HTTP接口和Elasticsearch的Java API接口。

第2章 “索引”,介绍和Elasticsearch索引相关的接口,包括索引管理、索引映射管理、索引别名、索引设置、索引监控、索引其他重要接口以及文档管理。

第3章 “映射”,介绍Elasticsearch文档的内部结构,Elasticsearch支持的字段类型,除此之外,本章还将展示Elasticsearch内置的元字段,映射的参数和动态映射功能。

第4章 “搜索”,详细介绍和搜索相关的知识,包括搜索的详细参数,搜索的评分机制、滚动查询、系统内部隐藏内容的查询、搜索模板等;接着介绍Elasticsearch的领域查询语言DSL(Domain-specific Language)相关的知识点;最后介绍Elasticsearch的精简查询接口。

第5章 “聚合”,聚合可以对文档中的数据进行统计汇总、分组等,通过聚合可以完成很多的统计功能,该章介绍聚合相关的知识,包括度量聚合、分组聚合和管道聚合。

第6章 “集群管理”,详细介绍和集群相关的内容,包括集群的监控、集群分片迁移、集群的节点配置、集群发现、集群平衡的原理和配置。

第7章 “索引分词器”,介绍Elasticsearch的分词器和分词的原理,以及如何添加新的分词器等;还介绍Elasticsearch的插件相关知识,包括插件安装等。

第8章 “高级配置”,介绍Elasticsearch的高级配置,包括网络配置、脚本配置、快照和恢复配置、线程池配置和索引配置。

第9章 “告警、监控和权限管理”,介绍Elasticsearch官方支持的几个比较好的插件:Watcher、Marvel、Shield,它们可以对Elasticsearch进行告警、监控和权限管理。

第10章 “ELK应用”,介绍Elasticsearch与另外两个产品Logstash和Kibana如何组合使用,Logstash是对日志进行收集和处理,Kibana是对存储在Elasticsearch中的索引进行展示和报表分析;最后通过一个简单的示例来介绍ELK几个产品是如何关联的。

在编写本书的时候,Elasticsearch的最新版本是2.2.0,但本书准备正式出版的时候,Elasticsearch发布了最新的5.0版本。所以本书增加了一个附录专门介绍5.0版本的特性与改进。本书前面的部分截图是2.2.0版本的,书中所有的例子和功能都可以在Elasticsearch 2.3.3下运行,大部分的功能都可以在5.0下运行,详细的新版本差别请参考附录部分。本书中的例子大部分都是HTTP接口的,这些接口的测试使用了Elasticsearch Head插件。如果你想使用另一种工具,请注意修改HTTP请求的格式和编码,以便适合你所选择的工具。书中例子的结构大多是JSON格式,美化后的JSON格式比较容易阅读,但美化后的JSON格式比较长,所以我们在不影响阅读的情况下,对美化后的格式做了简单调整。书中还有一小部分是Java接口,我们在实验时用的是Eclipse工具,其他主流的Java开发工具都适用。

本书的目标读者是对全文检索和Elasticsearch有兴趣的读者,如果你是一个初学者,通过本书你将学到Elasticsearch的基础知识,以及如何使用一些高级功能。如果你已经知道并使用了Elasticsearch但又想深入了解其本身,想了解如何改进查询相关性,如何使用Elasticsearch Java API等,也会发现本书的实用性。

由于时间紧,能力有限,编写的过程中难免有不当之处,还请各位读者不吝指出。

致谢

在此,首先我想感谢我的家庭,多年以来,因为工作关系我照顾他们太少,他们为我付出太多;我在全身心投入本书写作的时候,他们同样表现出了极大的耐心,是我最坚强的后盾。

其次还要感谢赛克蓝德公司以及公司的同事:周忠立、万荣慧和夏海华,是他们的辛勤工作才完成本书的编写工作,尤其是周忠立在很多章节的编写上贡献了很多的内容;同时要感谢本书的出版团队,尤其是吴怡编辑,写书是件非常艰巨的任务,很多内容需要反复推敲才能表达准确的意思,吴怡在检查错误、校稿、消除表达歧义等方面做出了很多贡献。

最后,非常诚挚地感谢所有Elasticsearch项目的创建者和开发者,感谢他们杰出的工作和对开源项目的热情。没有他们,就没有本书的诞生,没有他们,开源搜索引擎就不会有现在这种活力。再次感谢!朱林2016年10月于南京第1章Elasticsearch入门

欢迎来到Elasticsearch世界,它目前是全球最受欢迎的全文搜索引擎。你对Elasticsearch和全文搜索有没有经验都不要紧。我们希望你可以通过这本书走进Elasticsearch的大门。这本书是为初学者准备的,当然对于中高级的人员也有参考作用。我们首先介绍一些和Elasticsearch相关的基础内容。接着介绍一下Elasticsearch的安装和配置。此外本章还会介绍如何简单使用Elasticsearch,包括HTTP JSON接口和Java接口。在学习这些接口的过程中,不用陷入太多的细节,后面的章节会逐步展开并细化接口内容。读完本章,你将学到以下内容:

·Elasticsearch介绍

·全文搜索

·Elasticsearch的基础知识

·安装和配置Elasticsearch

·HTTP REST API接口

·Java开发接口1.1 Elasticsearch是什么

Elasticsearch(ES)是一个基于Lucene构建的开源、分布式、RESTful接口全文搜索引擎。Elasticsearch还是一个分布式文档数据库,其中每个字段均是被索引的数据且可被搜索,它能够扩展至数以百计的服务器存储以及处理PB级的数据。它可以在很短的时间内存储、搜索和分析大量的数据。它通常作为具有复杂搜索场景情况下的核心发动机。

Elasticsearch就是为高可用和可扩展而生的。可以通过购置性能更强的服务器来完成,称为垂直扩展或者向上扩展(Vertical Scale/Scaling Up),或增加更多的服务器来完成,称为水平扩展或者向外扩展(Horizontal Scale/Scaling Out)。

尽管ES能够利用更强劲的硬件,垂直扩展毕竟还是有它的极限。真正的可扩展性来自于水平扩展,通过向集群中添加更多的节点来分担负载,增加可靠性。

在大多数数据库中,水平扩展通常都需要你对应用进行一次大的重构来利用更多的节点。而ES天生就是分布式的:它知道如何管理多个节点来完成扩展和实现高可用性。这也意味着你的应用不需要做任何的改动。

我们举几个例子来说明Elasticsearch能做什么?

当你经营一家网上商店,你可以让你的客户搜索你卖的商品。在这种情况下,你可以使用Elasticsearch来存储你的整个产品目录和库存信息,为客户提供精准搜索,可以为客户推荐相关商品。

当你想收集日志或者交易数据的时候,需要分析和挖掘这些数据,寻找趋势,进行统计,总结,或发现异常。在这种情况下,你可以使用Logstash或者其他工具来进行收集数据,当这些数据存储到Elasticsearch中。你可以搜索和汇总这些数据,找到任何你感兴趣的信息。

当你运行一个价格提醒的平台,可以给客户提供一些规则,例如客户有兴趣购买一个电子设备,当商品的价格在未来一个月内价格低于多少钱的时候通知客户。在这种情况下,你可以把供应商的价格,把他们定期存储到Elasticsearch中,使用定时器过滤来匹配客户的需求,当查询到价格低于客户设定的值后给客户发送一条通知。

当有大量数据(千万条以上的记录)时,你有商业智能分析的需求,希望快速调查、分析和可视化。在这种情况下,你可以使用Elasticsearch来存储你的数据,然后用Kibana建立自定义的仪表板或者任何你熟悉的语言开发展示界面,你可以使用Elasticsearch的聚合功能来执行复杂的商业智能与数据查询。

对于程序员来说,比较有名的案例是GitHub,GitHub的搜索是基于Elasticsearch构建的,在github.com/search页面,你可以搜索项目、用户、issue、pull request,还有代码。共有40~50个索引库,分别用于索引网站需要跟踪的各种数据。虽然只索引项目的主分支(master),但这个数据量依然巨大,包括20亿个索引文档,30TB的索引文件。1.1.1 Elasticsearch的历史

网上流传的故事是:多年前,一个叫作Shay Banon的刚结婚不久的失业开发者,由于妻子要去伦敦学习厨师,他便跟着也去了。在他找工作的过程中,为了给妻子构建一个食谱的搜索引擎,他开始构建一个早期版本的Lucene。

直接基于Lucene工作会比较困难,所以Shay开始抽象Lucene代码以便Java程序员可以在应用中添加搜索功能。他发布了第一个开源项目,叫作“Compass”。

后来Shay找到一份工作,这份工作处在高性能和内存数据网格的分布式环境中,因此高性能的、实时的、分布式的搜索引擎也是理所当然需要的。然后他决定重写Compass库使其成为一个独立的服务叫作Elasticsearch。

第一个公开版本发布于2010年2月,在那之后Elasticsearch已经成为GitHub上最受欢迎的项目之一,代码贡献者超过300人。直到2016年3月30日,Elasticsearch已经发布了2.3.0版本。目前已经成为全球最受欢迎的全文搜索引擎。

那Elasticsearch为什么会有如此的魅力呢?我们首先看一下Elasticsearch的优点:

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

·分片机制提供更好的分布性:同一个索引分成多个分片(sharding),这点类似于HDFS的块机制;分而治之的方式可提升处理效率。

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

·使用简单:只需一条命令就可以下载文件,然后很快就能搭建一个站内搜索引擎。1.1.2 相关产品

Beats:它是一个代理,将不同类型的数据发送到Elasticsearch中。它可以直接将数据发送到Elasticsearch。Beats由三部分内容组成:Filebeat、Topbeat、Packetbeat。Filebeat用来收集日志。Topbeat用来收集系统基础设置数据,如CPU、内存、每个进程的统计信息。Packetbeat是一个网络包分析工具,统计收集网络信息。这三个工具是官方提供的。

Shield:它为Elasticsearch带来企业级的安全性,加密通信,认证保护整个Elasticsearch数据,它是基于角色的访问控制与审计。当今企业对安全需求越来越重视,Shield可以提供安全的Elasticsearch访问,从而保护核心的数据。注意:Shield是收费的产品。

Watcher:它是Elasticsearch的警报和通知工具。它可以主动监测Elasticsearch的状态,并在有异常的时候进行提醒,还可以根据你的数据变化情况来采取不同的处理方式。注意:Watcher也是收费的产品。

Marvel:它是Elasticsearch的管理和监控工具。它监测Elasticsearch集群索引和节点的活动,快速诊断问题。注意:Marvel也是收费的产品。1.2 全文搜索

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

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

Lucene最初是由Doug Cutting所撰写的,是一位资深全文索引/搜索专家,曾经是V-Twin搜索引擎的主要开发者,后来在Excite担任高级系统架构设计师,目前从事于一些Internet底层架构的研究。1.2.2 Lucene倒排索引

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

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

搜索引擎的关键步骤就是建立倒排索引,倒排索引一般表示为一个关键词,然后是它的频度(出现的次数)、位置(出现在哪一篇文章或网页中,及有关的日期,作者等信息),好比一本书的目录、标签一般。读者想看哪一个主题相关的章节,直接根据目录即可找到相关的页面。不必再从书的第一页到最后一页,一页一页地查找。

Lucene使用的是倒排文件索引结构,下面用例子介绍该结构及相应的生成算法。

假设有两篇文章1和文章2。

文章1的内容为:Tom lives in Guangzhou,I live in Guangzhou too.

文章2的内容为:He once lived in Shanghai.

1.取得关键词

由于Lucene是基于关键词索引和查询的,首先我们要取得这两篇文章的关键词,通常我们需要如下处理措施:

·我们现在有的是文章内容,即一个字符串,我们先要找出字符串中的所有单词,即分词。英文单词由于用空格分隔,比较好处理。中文单词间由于是连在一起的,所以需要特殊的分词处理。

·文章中的“in”“once”“too”等词没有什么实际意义,中文中的“的”“是”等字通常也无具体含义,这些不代表概念的词是可以过滤掉的。

·用户通常希望查“He”时能把含“he”和“HE”的文章也找出来,所以所有单词需要统一大小写。

·用户通常希望查“live”时能把含“lives”和“lived”的文章也找出来,所以需要把“lives”,“lived”还原成“live”。

·文章中的标点符号通常不表示某种概念,也可以过滤掉。

在Lucene中以上措施由Analyzer类完成。经过上面处理后,得到如下结果:

文章1的所有关键词为:[tom][live][guangzhou][i][live][guangzhou]

文章2的所有关键词为:[he][live][shanghai]

2.建立倒排索引

有了关键词后,我们就可以建立倒排索引了。上面的对应关系是:“文章号”对“文章中所有关键词”。倒排索引把这个关系倒过来,变成:“关键词”对“拥有该关键词的所有文章号”。

文章1和文章2经过倒排后的对应关系见表1-1。表1-1 倒排索引关键词文章号对应关系示例

通常仅知道关键词在哪些文章中出现还不够,我们还需要知道关键词在文章中出现的次数和位置,通常有两种位置:

·字符位置,即记录该词是文章中第几个字符(优点是显示并定位关键词快)。

·关键词位置,即记录该词是文章中第几个关键词(优点是节约索引空间、词组查询快),Lucene中记录的就是这种位置。

加上“出现频率”和“出现位置”信息后,我们的索引结构参见表1-2.表1-2 倒排索引关键词频率位置示例

以live这行为例,我们说明一下该结构:live在文章1中出现了2次,文章2中出现了一次,它的出现位置为“2,5,2”这表示什么呢?我们需要结合文章号和出现频率来分析,文章1中出现了2次,那么“2,5”就表示live在文章1中出现的两个位置,文章2中出现了一次,剩下的“2”就表示live是文章2中的第2个关键字。

以上就是Lucene索引结构中最核心的部分。我们注意到关键字是按字符顺序排列的(Lucene没有使用B树结构),因此Lucene可以用二元搜索算法快速定位关键词。

3.实现

实现时,Lucene将上面三列分别作为词典文件(Term Dictionary)、频率文件(frequencies)、位置文件(positions)保存。其中词典文件不仅保存了每个关键词,还保留了指向频率文件和位置文件的指针,通过指针可以找到该关键字的频率信息和位置信息。

Lucene中使用了field的概念,用于表达信息所在位置(如标题中、文章中、URL中),在建索引中,该field信息也记录在词典文件中,每个关键词都有一个field信息,因为每个关键字一定属于一个或多个field。

4.压缩算法

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

首先,对词典文件中的关键词进行了压缩,关键词压缩为<前缀长度,后缀>,例如:当前词为“阿拉伯语”,上一个词为“阿拉伯”,那么“阿拉伯语”压缩为<3,语>。

其次大量用到的是对数字的压缩,数字只保存与上一个值的差值(这样可以减少数字的长度,进而减少保存该数字需要的字节数)。例如当前文章号是16389(不压缩要用3个字节保存),上一文章号是16382,压缩后保存7(只用一个字节)。

5.应用场景

下面我们可以通过对该索引的查询来解释一下为什么要建立索引。

假设要查询单词“live”,Lucene先对词典二元查找、找到该词,通过指向频率文件的指针读出所有文章号,然后返回结果。词典通常非常小,因而,整个过程的时间是毫秒级的。

而用普通的顺序匹配算法,不建索引,而是对所有文章的内容进行字符串匹配,这个过程将会相当缓慢,当文章数目很大时,时间往往是无法忍受的。1.3 基础知识

在Elasticsearch中有很多的术语和概念,为了后面更好地理解和阅读本书,本节先介绍一下这些术语和概念,然后介绍一下Elasticsearch存储的格式JSON。1.3.1 Elasticsearch术语及概念

1.索引词(term)

在Elasticsearch中索引词(term)是一个能够被索引的精确值。foo、Foo、FOO几个单词是不同的索引词。索引词(term)是可以通过term查询进行准确的搜索。

2.文本(text)

文本是一段普通的非结构化文字。通常,文本会被分析成一个个的索引词,存储在Elasticsearch的索引库中。为了让文本能够进行搜索,文本字段需要事先进行分析;当对文本中的关键词进行查询的时候,搜索引擎应该根据搜索条件搜索出原文本。

3.分析(analysis)

分析是将文本转换为索引词的过程,分析的结果依赖于分词器。比如:FOO BAR、Foo-Bar和foo bar这几个单词有可能会被分析成相同的索引词foo和bar,这些索引词存储在Elasticsearch的索引库中。当用FoO:bAR进行全文搜索的时候,搜索引擎根据匹配计算也能在索引库中搜索出之前的内容。这就是Elasticsearch的搜索分析。

4.集群(cluster)

集群由一个或多个节点组成,对外提供服务,对外提供索引和搜索功能。在所有节点,一个集群有一个唯一的名称默认为“Elasticsearch”。此名称是很重要的,因为每个节点只能是集群的一部分,当该节点被设置为相同的集群名称时,就会自动加入集群。当需要有多个集群的时候,要确保每个集群的名称不能重复,否则,节点可能会加入错误的集群。请注意,一个节点只能加入一个集群。此外,你还可以拥有多个独立的集群,每个集群都有其不同的集群名称。例如,在开发过程中,你可以建立开发集群库和测试集群库,分别为开发、测试服务。Elasticsearch集群结构见图1-1。图1-1 Elasticsearch集群结构

5.节点(node)

一个节点是一个逻辑上独立的服务,它是集群的一部分,可以存储数据,并参与集群的索引和搜索功能。就像集群一样,节点也有唯一的名字,在启动的时候分配。如果你不想要默认名称,你可以定义任何你想要的节点名。这个名字在管理中很重要,在网络中Elasticsearch集群通过节点名称进行管理和通信。一个节点可以被配置加入一个特定的集群。默认情况下,每个节点会加入名为Elasticsearch的集群中,这意味着如果你在网络上启动多个节点,如果网络畅通,他们能彼此发现并自动加入一个名为Elasticsearch的集群中。在一个集群中,你可以拥有多个你想要的节点。当网络没有集群运行的时候,只要启动任何一个节点,这个节点会默认生成一个新的集群,这个集群会有一个节点。

6.路由(routing)

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

7.分片(shard)

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

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

8.主分片(primary shard)

每个文档都存储在一个分片中,当你存储一个文档的时候,系统会首先存储在主分片中,然后会复制到不同的副本中。默认情况下,一个索引有5个主分片。你可以事先制定分片的数量,当分片一旦建立,则分片的数量不能修改。

9.副本分片(replica shard)

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

·增加高可用性:当主分片失败的时候,可以从副本分片中选择一个作为主分片。

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

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

·允许水平分割扩展数据。

·允许分配和并行操作(可能在多个节点上)从而提高性能和吞吐量。

这些很强大的功能对用户来说是透明的,你不需要做什么操作,系统会自动处理。

10.复制(replica)

复制是一个非常有用的功能,不然会有单点问题。当网络中的某个节点出现问题的时候,复制可以对故障进行转移,保证系统的高可用。因此,Elasticsearch允许你创建一个或多个拷贝,你的索引分片就形成了所谓的副本或副本分片。

复制是重要的,主要的原因有:

·它提供了高可用性,当节点失败的时候不受影响。需要注意的是,一个复制的分片不会存储在同一个节点中。

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

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

默认情况下,每个索引分配5个分片和一个副本,这意味着你的集群节点至少要有两个节点,你将拥有5个主要的分片和5个副本分片共计10个分片。注意 每个Elasticsearch分片是一个Lucene的索引。有文档存储数量限制,你可以在一个单一的Lucene索引中存储的最大值为lucene-5843,极限是2147483519(=integer.max_value-128)个文档。你可以使用_cat/shards API监控分片的大小。

11.索引(index)

索引是具有相同结构的文档集合。例如,可以有一个客户信息的索引,包括一个产品目录的索引,一个订单数据的索引。在系统上索引的名字全部小写,通过这个名字可以用来执行索引、搜索、更新和删除操作等。在单个集群中,可以定义多个你想要的索引。索引结构参见图1-2。

12.类型(type)

在索引中,可以定义一个或多个类型,类型是索引的逻辑分区。在一般情况下,一种类型被定义为具有一组公共字段的文档。例如,让我们假设你运行一个博客平台,并把所有的数据存储在一个索引中。在这个索引中,你可以定义一种类型为用户数据,一种类型为博客数据,另一种类型为评论数据。

13.文档(document)

文档是存储在Elasticsearch中的一个JSON格式的字符串。它就像在关系数据库中表的一行。每个存储在索引中的一个文档都有一个类型和一个ID,每个文档都是一个JSON对象,存储了零个或者多个字段,或者键值对。原始的JSON文档被存储在一个叫作_source的字段中。当搜索文档的时候默认返回的就是这个字段。图1-2 Elasticsearch索引术语结构

14.映射(mapping)

映射像关系数据库中的表结构,每一个索引都有一个映射,它定义了索引中的每一个字段类型,以及一个索引范围内的设置。一个映射可以事先被定义,或者在第一次存储文档的时候自动识别。

15.字段(field)

文档中包含零个或者多个字段,字段可以是一个简单的值(例如字符串、整数、日期),也可以是一个数组或对象的嵌套结构。字段类似于关系数据库中表的列。每个字段都对应一个字段类型,例如整数、字符串、对象等。字段还可以指定如何分析该字段的值。

16.来源字段(source field)

默认情况下,你的原文档将被存储在_source这个字段中,当你查询的时候也是返回这个字段。这允许你可以从搜索结果中访问原始的对象,这个对象返回一个精确的JSON字符串,这个对象不显示索引分析后的其他任何数据。

17.主键(ID)

ID是一个文件的唯一标识,如果在存库的时候没有提供ID,系统会自动生成一个ID,文档的index/type/id必须是唯一的。1.3.2 JSON介绍

在Elasticsearch中的接口中,大多数都是以JSON的格式进行的,那JSON是什么呢?JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人们阅读和编写,同时也易于机器解析和生成。它基于JavaScript Programming Language,Standard ECMA-2623rd Edition-December 1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换格式。

JSON有两种结构:

·“名称/值”对的集合(A collection of name/value pairs)。不同的语言中的理解不同,如对象(object)、纪录(record)、结构(struct)、字典(dictionary)、哈希表(hash table)、有键列表(keyed list)或者关联数组(associative array)。

·值的有序列表(An ordered list of values)。在大部分语言中,是指数组(array)。

这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些格式的编程语言之间进行交换成为可能。

例1-1

1.“名称/值”对

按照最简单的形式,可以用下面这样的JSON表示“名称/值”对:{"firstName":"Brett"}

这个示例非常基础,而且实际上比等效的纯文本“名称/值”对占用更多的空间:firstName=Brett

但是,当将多个“名称/值”对串在一起时,JSON就会体现出它的价值了。首先,可以创建包含多个“名称/值”对的记录,比如:,,{"firstName":"Brett""lastName":"McLaughlin""email":"aaaa"}

从语法方面来看,这与“名称/值”对相比并没有很大的优势,但是在这种情况下JSON更容易使用,而且可读性更好。例如,它明确地表示以上三个值都是同一记录的一部分;用花括号将这些值进行关联。

2.表示数组

当需要表示一组值时,JSON不但能够提高可读性,而且可以减少复杂性。例如,假设你希望表示一个人名列表。在XML中,需要许多开始标记和结束标记;如果使用典型的“名称/值”对,那么必须建立一种专有的数据格式,或者将键名称修改为person1-firstName这样的形式。

如果使用JSON,就只需将多个带花括号的记录分组在一起:{ "people":[,,, {"firstName":"Brett""lastName":"McLaughlin""email":"aaaa"},,, {"firstName":"Jason""lastName":"Hunter""email":"bbbb"},, {"firstName":"Elliotte""lastName":"Harold""email":"cccc"} ]}

这不难理解。在这个示例中,只有一个名为people的变量,值是包含三个条目的数组,每个条目是一个人的记录,其中包含名、姓和电子邮件地址。上面的示例演示如何用括号将记录组合成一个值。当然,可以使用相同的语法表示多个值(每个值包含多个记录),如下所示:{,,, "programmers": [{"firstName": "Brett""lastName": "McLaughlin""email": "aaaa"},,, {"firstName": "Jason""lastName": "Hunter""email": "bbbb"}],,, "authors": [{"firstName": "Isaac""lastName": "Asimov""genre": "sciencefiction"},, {"firstName": "Sergei""lastName": "Rachmaninoff""instrument": "piano"}]}

这里最值得注意的是,能够表示多个值,每个值进而包含多个值。但是还应该注意,在不同的主条目(programmers、authors和musicians)之间,记录中实际的“名称/值”对可以不同。JSON是完全动态的,允许在JSON结构的中间改变表示数据的方式。

在处理JSON格式的数据时,没有需要遵守的预定义的约束。所以,在同样的数据结构中,可以改变表示数据的方式,甚至可以用不同方式表示同一事物。1.4 安装配置

下面是安装Elasticsearch所需要的几个步骤,接下来几节将详细说明。1.4.1 安装Java

为了运行Elasticsearch,第一步是要安装Java,Elasticsearch需要Java 7或者更高版本的支持。建议使用最新的Oracle的JDK版本1.8.0_72。如需了解Java的情况,可以到Oracle的官网找相关的资料。在你安装Elasticsearch前,请检查你的Java版本运行:java-version1.4.2 安装Elasticsearch

当我们设置好Java后,下载最新的Elasticsearch版本,解压,安装完毕。下载地址为:https://www.elastic.co/downloads/past-releases/elasticsearch-2-3-0。

Elasticsearch是Java开发的,所以JVM的环境变量JAVA_OPTS对Elasticsearch是非常重要的。在JAVA_OPTS中对Elasticsearch最重要的参数是-Xmx最大可以使用内存的参数,一般情况下大内存更能发挥Elasticsearch作用,建议-Xmx设置为物理内存的一半,为了减少内存分配带来的性能损耗,最好一开始就设置初始内存和最大内存都为物理内存的一半,即Xms和Xmx这两个参数。

由于JAVA_OPTS大多数时候对整个机器环境起作用,所以最好是保留默认的JAVA_OPTS,最好用ES_JAVA_OPTS环境变量设置来作为JAVA_OPTS参数:

默认的配置文件在elasticsearch/bin/elasticsearch.in.sh中。if [ "x$ES_MIN_MEM" = "x" ]; then ES_MIN_MEM=256mfiif [ "x$ES_MAX_MEM" = "x" ]; then ES_MAX_MEM=1gfiif [ "x$ES_HEAP_SIZE" != "x" ]; then ES_MIN_MEM=$ES_HEAP_SIZE ES_MAX_MEM=$ES_HEAP_SIZEfiJAVA_OPTS="$JAVA_OPTS -Xms${ES_MIN_MEM}"JAVA_OPTS="$JAVA_OPTS -Xmx${ES_MAX_MEM}"

ES_HEAP_SIZE环境变量允许设置被分配到Elasticsearch java进程中堆内存的大小。最小值和最大值将分配相同的值,可以通过设置ES_MIN_MEM(默认为256M)和ES_MAX_MEM(默认为1G)对堆内存进行设置。1.4.3 配置

Elasticsearch配置文件在elasticsearch/config文件夹下。在这个文件夹中有两个文件,一个是Elasticsearch配置不同模块的配置文件elasticsearch.yml,另一个是Elasticsearch日志的配置文件logging.yml。默认配置文件的格式为YML。

Elasticsearch提供了多种方式进行设置,在系统内部,都使用命名空间来表示这些设置,根据这些命名空间,系统可以很容易地扩展到其他格式。比如我们设置节点名称如下:

1)yml格式为:node.name:node-1。

2)JSON格式为:只需要把elasticsearch.yml名修改成elasticsearch.json。

配置的方式为:{ "node" : {"name" : "node-1"}}

3)通过Elasticsearch命令的参数来设置配置信息。例如:elasticsearch -Des.node.name=node-1

4)Elasticsearch还可以通过交互式方式进行设置,通过${prompt.text}或者${prompt.secret}来指定,${prompt.secret}表示在终端中隐藏输入的值,${prompt.text}表示在终端中显示输入的值,例如:node.name: ${prompt.text}

在Elasticsearch命令执行时,将提示你输入的实际值,例如下面的提示:Enter value for [node.name]:注意 当Elasticsearch作为服务或者在后台启动的时候,这两个参数不起作用。

1.elasticsearch.yml配置说明

集群名称:cluster.name: my-application

确保在不同的环境中集群的名称不重复,否则,节点可能会连接到错误的集群上。

节点名称:node.name: node-1

默认情况下,当节点启动时Elasticsearch将随机在一份3000个名字的列表中随机指定一个。如果机器上只运行一个集群Elasticsearch节点,可以用${HOSTNAME}设置节点的名称为主机名。

节点描述:node.rack: r1

索引存储位置:path.data: /path/to/data

日志存储位置:path.logs: /path/to/logs

内存分配模式:bootstrap.mlockall: true

绑定的网卡IP:network.host: 192.168.0.1

http协议端口:http.port: 9200

开始发现新节点的IP地址:,discovery.zen.ping.unicast.hosts: ["host1" "host2"]

最多发现主节点的个数:discovery.zen.minimum_master_nodes: 3

当重启集群节点后最少启动N个节点后开始做恢复:gateway.recover_after_nodes: 3

在一台机器上最多启动的节点数:node.max_local_storage_nodes: 1

当删除一个索引的时候,需要指定具体索引的名称:action.destructive_requires_name: true

2.索引配置说明

在集群中创建的索引可以提供每个索引自己的设置。例如,下面创建一个索引刷新间隔是5秒钟而不是默认的刷新间隔(格式可以是YAML或JSON):

请求:PUT http://127.0.0.1:9200/kimchy

参数:index:refresh_interval:5s

这个索引参数可以设置在节点上,例如,在elasticsearch.yml文件中可以设置:index.refresh_interval: 5s

这意味着除非索引明确定义,这个节点上创建的每个索引的刷新间隔为5秒。

当然也可以在启动Elasticsearch的时候用参数指定:elasticsearch -Des.index.refresh_interval=5s

3.日志配置说明

Elasticsearch内部使用log4j记录系统日志,它试图通过使用YAML配置方式来简化log4j的配置,配置文件位置为elasticsearch/config/logging.yml。JSON格式和键值对的格式也是支持的。可以加载多个配置文件,在启动Elasticsearch后系统自动合并多个配置文件。支持不同的后缀格式,例如:(.yml,.yaml,.json or.properties)。

记录器部分包含java包和相应的日志级别,在配置里可以省略org.elasticsearch前缀。Appender部分包含日志描述信息。更多内容请参见log4j。

由于日志比较重要,正常情况下不要禁止日志的产生,如果感觉日志过多,可以提高日志的级别。系统日志每日会生成一个新的文件。当遇到问题的时候,首先要检查一下日志文件,看看是否有出错的信息。1.4.4 运行

在Windows下执行elasticsearch.bat,在Linux下运行./elasticsearch。

如果一切顺利的话,你应该看到如下信息:,,,[2016-02-03 16:53:31122][INFO ][node] [Rintrah] version[2.2.0] pid[6840] build[8ff36d1/2016-01-27T13:32:39Z],[2016-02-03 16:53:31122][INFO ][node] [Rintrah] initializing ...,,[2016-02-03 16:53:31668][INFO ][plugins] [Rintrah] modules [lang-groovy lang-,,expression] plugins [] sites [],,[2016-02-03 16:53:31684][INFO ][env] [Rintrah] using [1] data paths mounts [[,,,work (D:)]] net usable_space [67.2gb] net total_space [99.9gb] spins? [,unknown] types [NTFS],,[2016-02-03 16:53:31684][INFO ][env] [Rintrah] heap size [910.5mb] compressed ordinary object pointers [true],[2016-02-03 16:53:33637][INFO ][node] [Rintrah] initialized,[2016-02-03 16:53:33637][INFO ][node] [Rintrah] starting ...,[2016-02-03 16:53:33918][INFO ][transport] [Rintrah] publish_address {127.0.0.1:,,9300} bound_addresses {[::1]:9300} {127.0.0.1:9300},[2016-02-03 16:53:33934][INFO ][discovery] [Rintrah] elasticsearch/ 1oo5dtelT8ax-3LmnTrs8g,[2016-02-03 16:53:37982][INFO ][cluster.service] [Rintrah] new_master {Rintrah}{,1oo5dtelT8ax-3LmnTrs8g}{127.0.0.1}{127.0.0.1:9300} reason: zen-disco-join(,elected_as_master [0] joins received),[2016-02-03 16:53:40363][INFO ][gateway] [Rintrah] recovered [0] indices into cluster_state,,[2016-02-03 16:53:40567][INFO ][http] [Rintrah] publish_address {127.0.0.1:9200}, bound_addresses {[::1]:9200} {127.0.0.1:9200},[2016-02-03 16:53:40567][INFO ][node] [Rintrah] started

这样我们就已经启动了Elasticsearch,当然我们也可以在启动的时候修改集群的名称和节点的名称。例如:./elasticsearch --cluster.name my_cluster_name --node.name my_node_name

默认情况下,Elasticsearch使用9200端口提供的REST API。该端口是可配置的。

在本机访问http://127.0.0.1:9200/。

将会得到以下内容:{, "name" : "Rintrah", "cluster_name" : "elasticsearch", "version" : {"number" : "2.2.0", "build_hash" : "8ff36d139e16f8720f2947ef62c8167a888992fe",, "build_timestamp" : "2016-01-27T13:32:39Z""build_snapshot" : false "lucene_version" : "5.4.1", }, "tagline" : "You Know for Search"}

现在,我们的节点(和集群)将正确运行,下一步就是要了解如何进行使用。Elasticsearch提供了非常全面和强大的REST API,通过这些API,我们可以了解集群的信息。这些API可以做如下事情:

1)检查集群、节点和索引的情况、状态和统计。

2)管理集群、节点、索引数据和文档数据。

3)执行CRUD(创建、读取、更新和删除)操作,可以对索引进行操作。

4)执行高级搜索操作,如分页、排序、过滤、脚本、聚合及其他操作。1.4.5 停止

如果需要停止Elasticsearch,有以下两种方法。

·如果节点是连接到控制台,按下Ctrl+C。

·杀进程(Linux是kill,Windows下用任务管理器)。

由于Elasticsearch常用在集群中,集群停止相对有些复杂,参考1.4.7版本升级。1.4.6 作为服务

1.Linux下作为服务

Elasticsearch创建了debian安装包和RMP安装包,可以在官网的下载页面中进行下载。安装包需要依赖Java,除此就没有任何依赖。

在Debian系统下可以使用标准的系统工具,init脚本放在/etc/init.d/elasticsearch下,配置文件默认放在/etc/default/elasticsearch下。从debian软件包安装好后默认是不启动服务的。其原因是为了防止实例不小心加入集群。安装好后用dpkg-i命令来确保,当系统启动后启动Elasticsearch需要运行下面的两个命令:sudo update-rc.d elasticsearch defaults 95 10sudo /etc/init.d/elasticsearch start

当用户运行Debian8或者Ubuntu14或者更高版本的时候,系统需要用systemd来代替update-rc.d,在这种情况下,请使用systemd来运行,参见下面的介绍。

Elasticsearch通常的建议是使用Oracle的JDK。可以用下面的命令安装:sudo add-apt-repository ppa:webupd8team/javasudo apt-get updatesudo apt-get install oracle-java8-installerjava -version

基于RPM的系统一般使用chkconfig来启用和禁用服务。init脚本位于/etc/init.d/elasticsearch下,配置文件放在/etc/sysconfig/Elasticsearch下。同Debian系统类似,安装好后也不会自动加入自启动服务中。需要手工指定:sudo /sbin/chkconfig --add elasticsearchsudo service elasticsearch start

2.systemd服务启动

很多Linux系统,例如Debian Jessie、Ubuntu 14等,系统不使用chkconfig来注册服务,取而代之的是用systemd来启动和停止服务。命令是/bin/systemctl来启动和停止服务。RPM包安装的配置文件在/etc/sysconfig/elasticsearch下,deb包安装的配置文件在/etc/default/elasticsearch下。安装RPM之后,你必须改变系统配置,然后启动Elasticsearch。sudo /bin/systemctl daemon-reloadsudo /bin/systemctl enable elasticsearch.servicesudo /bin/systemctl start elasticsearch.service

同时注意改变在/etc/sysconfig/elasticsearch中的MAX_MAP_COUNT设置是没有任何效果的。需要改变/usr/lib/sysctl.d/elasticsearch.conf中的配置才起作用。

3.Windows下作为服务

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载