如今,企业淹没在系统生成的浩瀚数据流当中。大数据技术业已集中在如何存储和处理这些海量的数据上。虽然离线数据的批处理非常重要,但我们通常需要对相应的实时数据做出明智的判断。这就是搜索引擎的用武之地,siteber.com将其描述为“最具活力的行业”:
搜索引擎行业在过去几年的成长,已经足以巩固其在美国最具创新性行业之一的地位。
于是乎,Elasticsearch和Apache Solr这两款当世领先的开源搜索引擎,正在享受着更广泛的使用,吸引着更多人的关注。Gheorghe、Hinman和Russo所著的新书《Elasticsearch in Action》是一本非常好的书,简洁地一步步介绍了搜索,解释了Elasticsearch是如何实现搜索功能的,并提供很多代码示例。这本书还深入讲述了Elasticsearch的管理和配置,强调了索引和搜索性能之间的权衡。
这本书的主要内容分为两部分:“核心功能”和“高级功能”,随后是几个附录,覆盖了非常重要但不通用的功能(只适用于一些特殊的应用场景)。
本书的第一部分描述了Elasticsearch核心构建块及其功能。覆盖了Elasticsearch建模和索引数据的主要功能和方法,它们将用于支持基于应用系统的查询和分析。
- 第一章介绍了通用搜索引擎的功能,及其在Elasticsearch中的实现。这章的最后介绍了Elasticsearch的安装,用于运行全书提供的示例。
- 第二章讲述了Elasticsearch服务器中的数据组织,包括逻辑数据模型(搜索应用与Elasticsearch交互的方式)和物理布局(服务器内部处理数据的方式)。接下来,展示了这种数据模型是如何运用于典型的操作场景之中,即索引文档、查询文档、通过聚合分析数据,并水平扩展到多个节点上。
- 第三章详述了从Elasticsearch读写数据和维护数据的细节:索引、更新和删除文档。通过分析文档的字段,详述了索引过程;向读者讲述了当我们写入时,都包含哪些内容,会发生什么事情。
- 第四章详述了全文搜索,包括主要的查询器和过滤器、它们的内部工作机制,以及各种搜索方法的权衡。本章的最后,演示了一些最常用的过滤器和查询器,并解释了它们对于不同应用场景的适用性。
- 第五章阐述了如何将文档和查询器中的文本,分析和拆分为用于搜索的词条。本章介绍了Elasticsearch提供的不同类型的分析器,并说明了如何构建我们自己的分析器,以充分利用Elasticsearch的全文搜索潜能。本章还介绍了用于解决复杂搜索业务的Ngrams、Shingles和Stemming。
- 第六章关注于相关性计算,也就是打分(score),它定义了文档对原始查询的相关性。本章描述了影响文档打分的因素及其维护方式——使用不同的打分算法、调整指定查询器或者字段的boost值。本章还展示了Elasticsearch中,用于计算打分的API。
- 第七章展示了如何使用聚合来执行实时数据分析。在Elasticsearch中的具体做法是,加载文档、匹配搜索条件,以及执行各种排序计算,比如统计字符类型字段中词项的数量,或者计算数值类型字段的平均值。聚合被分为两种:度量和桶。度量聚合是指对一组文档进行静态分析,得到度量值,比如最小值、最大值、均方差等。桶式聚合将匹配的文档拆分进一个或多个桶容器,然后告诉你每个桶里有多少文档。
- 第八章是第一部分的最后一章,讲述了Elasticsearch对关系的支持。本章讨论了Elasticsearch提供的处理关系的几种常见方法,包括对象类型、嵌套文档、父子关系和一般的非规范化。同时,说明了如何使用每一种方法,以及它的优点和缺点。
本书的第二部分讲述了如何在生产环境中使用Elasticsearch。书中提供了每种功能的工作原理,及其对性能和稳定性的影响:
- 第九章讲述了水平扩展Elasticsearch到多个节点。包括增加、删除、解除节点、选举Master的过程和分片迁移的机制。还深入分析了扩展的策略,包括索引分片和副本的最佳实践,比如,使用Oversharding或者基于时间的索引来确保当前的设计可以处理明年的数据。此外,还说明了如何使用索引别名和路由来提高集群的灵活性和可扩展性。在本章的最后,演示了如何使用Elasticsearch的API展示集群的状态和健康状况。
- 第十章讲述了多种提高集群性能的办法。首先是如何将多个请求,比如index、update、delete、get和search合并成一次HTTP调用。这种分组通过最小化网络往返流量,可以大幅提高应用的性能。接着是Elasticsearch如何处理Lucene(底层搜索库)段:如何设置读写的刷新(refresh和flush)、合并策略和存储,这些设置对索引和搜索性能有何影响,以及在索引和搜索之间性能调优的权衡。本章的最后,讨论了影响Elasticsearch速度的一个重要的因素,缓存。详述了过滤器缓存的细节和最佳实践。还讲述了分片查询缓存,以及如何在预留足够的空间给Elasticsearch堆空间的同时,给操作系统足够的空间去缓存索引。
- 第十一章讲述了监控和管理生产集群。包括额外的设置方法、简化集群管理,以及监控生产环境必要的度量指标。最后,讨论了备份和恢复一个数据节点。
六个附录包含了有关Elasticsearch的更多信息:
- 附录A是关于地理空间搜索的。它可以为应用带来位置感知能力。Elasticsearch支持存储位置信息(点和多边形)和通用的空间操作,比如两点间距离、图形包含点、图形间重叠等计算。附录演示了如何在搜索中使用这一功能。
- 附录B是讲如何管理Elasticsearch插件的。插件是一种开箱即用的,能为Elasticsearch带来扩展和增强功能的强大方式。附录中介绍了两种类型的插件。一种是site插件,没有额外的功能,只是为Elasticsearch提供了网页服务。另一种是code插件,可以是任何包含JVM代码、能被Elasticsearch执行的插件。附录讲述了如何安装、使用和卸载插件。
- 附录C是关于Highlighting选项及其实现的。Highlighting指示为什么文档出现再查询结果中,匹配的词项被加上强调样式,让用户感受到文档是说什么的,以及和查询之间的关系。
- 附录D是关于监控插件的。Elasticsearch社区提供了很多监控插件,可以通过引人入胜的图形界面,更容易地管理集群的状态、索引,以及执行查询。
- 附录E是关于如何使用Elasticsearch渗滤器(percolator)的。渗滤器通常被定义为『搜索倒置』。渗滤器索引的是查询信息而不是索引文档。将查询注册并存储到内存当中,以便日后快速执行。使用渗滤器时,我们发送给Elasticsearch的是文档,而不是查询信息。这被称为渗滤文档,基本上会对其索引到小内存索引上。Elasticsearch根据小索引从已然注册的查询信息中查询,并返回匹配的查询信息。
- 最后,附录F是关于建议器(suggester)的。附录解释了如何使用不同的建议器实现用户意图的自动补全功能。这里所描述的基本功能,包括词项和短语的建议、补全和上下文的建议。附录描述了各种建议器和Elasticsearch中与此功能相关的API。