Elasticsearch技术解析与实战
上QQ阅读APP看书,第一时间看更新

前言

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月于南京