编辑推荐
现代搜索看起来好像很神奇——在搜索引擎中键入几个单词,搜索引擎看上去就好像知道你想要什么。有了Elasticsearch实时搜索和分析引擎,无需进行复杂的底层编程,也无需理解高级的数据科学算法,你就可以为用户提供这种神奇的体验。你只要安装它,调试它,就可以继续你的工作了。
本书将教读者编写提供专业的高质量搜索的应用程序的方法。随着阅读的深入,读者将学会为任何应用程序添加基本的搜索特性,通过预测性分析和相关性排序来增强搜索结果,并使用之前搜索中保存的数据为用户提供定制化的体验。这本实战型的书籍聚焦在使用HTTP协议的Elasticsearch REST API。代码片段的书写多数是使用cURL的bash脚本,所以很容易翻译成其他编程语言。
本书主要内容
.什么是良好的搜索应用?
.打造可扩展的搜索解决方案。
.通过任何语言使用Elasticsearch 。
.配置和调优。
对于构建并管理面向搜索的应用程序而言,本书是程序开发者和系统管理员的选择。
内容简介
本书主要展示如何使用Elasticsearch构建可扩展的搜索应用程序。书中覆盖了Elasticsearch的主要特性,从使用不同的分析器和查询类型进行相关性调优,到使用聚集功能进行实时性分析,还有地理空间搜索和文档过滤等更多吸引人的特性。
全书共分两个部分,第一部分解释了核心特性,内容主要涉及Elasticsearch的介绍,数据的索引、更新和删除,数据的搜索,数据的分析,使用相关性进行搜索,使用聚集来探索数据,文档间的关系等;第二部分介绍每个特性工作的更多细节及其对性能和可扩展性的影响,以便对核心功能进行产品化,内容主要涉及水平扩展和性能提升等。此外,本书还有6个附录(网上下载),提供了读者应该知道的特性,展示了关于地理空间搜索和聚集,如何管理Elasticsearch插件,学习在搜索结果中如何高亮查询单词,在生产环境中用来协助管理Elasticsearch的第三方的监控工具有哪些,如何使用Percolator过滤为多个查询匹配少量文档,如何使用不同的建议器来实现自动完成的功能。
作者简介
拉杜·乔戈(Radu Gheorghe)是搜索技术顾问和软件工程师。
马修·李·欣曼(Matthew Lee Hinman)开发过基于云的高可用系统。
罗伊·罗素(Roy Russo)是预测分析方面的专家。
译者简介
黄申博士,现任LinkedIn(领英)资深数据科学家,毕业于上海交通大学计算机科学与工程专业,师从俞勇教授。微软学者、IBM ExtremeBlue天才计划成员。长期专注于大数据相关的搜索、推荐、广告以及用户精准化领域。曾在微软亚洲研究院、eBay中国、沃尔玛1号店(现京东1号店)和大润发飞牛网担任要职,带团队完成了若干公司级的战略项目。同时在国际上发表20多篇论文,并拥有10多项国际专利。《计算机工程》特邀审稿专家,2016年出版了《大数据架构商业之路》一书,广受好评。因对业界做出卓越贡献,获得美国政府颁发的“美国杰出人才”称号。
目录
- 第 一部分
- 第 1章 Elasticsearch介绍 2
- 1.1 用Elasticsearch解决搜索问题 3
- 1.1.1 提供快速查询 3
- 1.1.2 确保结果的相关性 4
- 1.1.3 超越*确匹配 5
- 1.2 探索典型的Elasticsearch使用案例 6
- 1.2.1 将Elasticsearch作为主要的后端系统 7
- 1.2.2 将Elasticsearch添加到现有的系统 7
- 1.2.3 将Elasticsearch和现有工具一同使用 8
- 1.2.4 Elasticsearch的主要特性 10
- 1.2.5 扩展Lucene的功能 10
- 1.2.6 在Elasticsearch中组织数据 12
- 1.2.7 安装Java语言 12
- 1.2.8 下载并启动Elasticsearch 13
- 1.2.9 验证是否工作 14
- 1.3 小结 16
- 第 2章 深入功能 17
- 2.1 理解逻辑设计:文档、类型和索引 18
- 2.1.1 文档 19
- 2.1.2 类型 20
- 2.1.3 索引 21
- 2.2 理解物理设计:节点和分片 21
- 2.2.1 创建拥有一个或多个节点的集群 22
- 2.2.2 理解主分片和副本分片 23
- 2.2.3 在集群中分发分片 25
- 2.2.4 分布式索引和搜索 26
- 2.3 索引新数据 27
- 2.3.1 通过cURL索引一篇文档 28
- 2.3.2 创建索引和映射类型 30
- 2.3.3 通过代码样例索引文档 31
- 2.4 搜索并获取数据 32
- 2.4.1 在哪里搜索 33
- 2.4.2 回复的内容 33
- 2.4.3 如何搜索 36
- 2.4.4 通过ID获取文档 39
- 2.5 配置Elasticsearch 40
- 2.5.1 在elasticsearch.yml中指定集群的名称 40
- 2.5.2 通过logging.yml指定详细日志记录 41
- 2.5.3 调整JVM设置 41
- 2.6 在集群中加入节点 42
- 2.6.1 启动*二个节点 43
- 2.6.2 增加额外的节点 44
- 2.7 小结 45
- 第3章 索引、更新和删除数据 47
- 3.1 使用映射来定义各种文档 48
- 3.1.1 检索和定义映射 49
- 3.1.2 扩展现有的映射 50
- 3.2 用于定义文档字段的核心类型 51
- 3.2.1 字符串类型 52
- 3.2.2 数值类型 54
- 3.2.3 日期类型 55
- 3.2.4 布尔类型 56
- 3.3 数组和多字段 56
- 3.3.1 数组 56
- 3.3.2 多字段 57
- 3.4 使用预定义字段 58
- 3.4.1 控制如何存储和搜索文档 59
- 3.4.2 识别文档 61
- 3.5 更新现有文档 63
- 3.5.1 使用更新API 64
- 3.5.2 通过版本来实现并发控制 66
- 3.6 删除数据 69
- 3.6.1 删除文档 70
- 3.6.2 删除索引 71
- 3.6.3 关闭索引 72
- 3.6.4 重新索引样本文档 73
- 3.7 小结 73
- 第4章 搜索数据 74
- 4.1 搜索请求的结构 75
- 4.1.1 确定搜索范围 75
- 4.1.2 搜索请求的基本模块 76
- 4.1.3 基于请求主体的搜索请求 78
- 4.1.4 理解回复的结构 81
- 4.2 介绍查询和过滤器DSL 82
- 4.2.1 match查询和term过滤器 82
- 4.2.2 常用的基础查询和过滤器 85
- 4.2.3 match查询和term过滤器 91
- 4.2.4 phrase_prefix查询 92
- 4.3 组合查询或复合查询 93
- 4.3.1 bool查询 93
- 4.3.2 bool过滤器 96
- 4.4 超越match和过滤器查询 98
- 4.4.1 range查询和过滤器 98
- 4.4.2 prefix查询和过滤器 99
- 4.4.3 wildcard查询 100
- 4.5 使用过滤器查询字段的存在性 102
- 4.5.1 exists过滤器 102
- 4.5.2 missing过滤器 102
- 4.5.3 将任何查询转变为过滤器 103
- 4.6 为任务选择*好的查询 104
- 4.7 小结 105
- 第5章 分析数据 106
- 5.1 什么是分析 106
- 5.1.1 字符过滤 107
- 5.1.2 切分为分词 108
- 5.1.3 分词过滤器 108
- 5.1.4 分词索引 108
- 5.2 为文档使用分析器 109
- 5.2.1 在索引创建时增加分析器 109
- 5.2.2 在Elasticsearch的配置中添加分析器 111
- 5.2.3 在映射中指定某个字段的分析器 112
- 5.3 使用分析API来分析文本 113
- 5.3.1 选择一个分析器 114
- 5.3.2 通过组合即兴地创建分析器 115
- 5.3.3 基于某个字段映射的分析 115
- 5.3.4 使用词条向量API来学习索引词条 116
- 5.4 分析器、分词器和分词过滤器 117
- 5.4.1 内置的分析器 117
- 5.4.2 分词器 119
- 5.4.3 分词过滤器 122
- 5.5 N元语法、侧边N元语法和滑动窗口 128
- 5.5.1 一元语法过滤器 128
- 5.5.2 二元语法过滤器 129
- 5.5.3 三元语法过滤器 129
- 5.5.4 设置min_gram和max_gram 129
- 5.5.5 侧边N元语法过滤器 129
- 5.5.6 N元语法的设置 130
- 5.5.7 滑动窗口分词过滤器 131
- 5.6 提取词干 132
- 5.6.1 算法提取词干 133
- 5.6.2 使用字典提取词干 133
- 5.6.3 重写分词过滤器的词干提取 134
- 5.7 小结 134
- 第6章 使用相关性进行搜索 136
- 6.1 Elasticsearch的打分机制 137
- 6.1.1 文档打分是如何运作的 137
- 6.1.2 词频 137
- 6.1.3 逆文档频率 138
- 6.1.4 Lucene评分公式 138
- 6.2 其他打分方法 139
- 6.3 boosting 141
- 6.3.1 索引期间的boosting 142
- 6.3.2 查询期间的boosting 142
- 6.3.3 跨越多个字段的查询 143
- 6.4 使用“解释”来理解文档是如何被评分的 144
- 6.5 使用查询再打分来减小评分操作的性能影响 147
- 6.6 使用function_score来定制得分 148
- 6.6.1 weight函数 149
- 6.6.2 合并得分 150
- 6.6.3 field_value_factor函数 151
- 6.6.4 脚本 152
- 6.6.5 随机 152
- 6.6.6 衰减函数 153
- 6.6.7 配置选项 155
- 6.7 尝试一起使用它们吧 156
- 6.8 使用脚本来排序 157
- 6.9 字段数据 158
- 6.9.1 字段数据缓存 158
- 6.9.2 字段数据用在哪里 159
- 6.9.3 管理字段数据 160
- 6.10 小结 163
- 第7章 使用聚集来探索数据 164
- 7.1 理解聚集的具体结构 166
- 7.1.1 理解聚集请求的结构 166
- 7.1.2 运行在查询结果上的聚集 168
- 7.1.3 过滤器和聚集 169
- 7.2 度量聚集 170
- 7.2.1 统计数据 171
- 7.2.2 *级统计 172
- 7.2.3 近似统计 173
- 7.3 多桶型聚集 176
- 7.3.1 terms聚集 177
- 7.3.2 range聚集 183
- 7.3.3 histogram聚集 185
- 7.4 嵌套聚集 187
- 7.4.1 嵌套多桶聚集 189
- 7.4.2 通过嵌套聚集获得结果分组 190
- 7.4.3 使用单桶聚集 192
- 7.5 小结 196
- 第8章 文档间的关系 197
- 8.1 定义文档间关系的选项概览 197
- 8.1.1 对象类型 198
- 8.1.2 嵌套类型 200
- 8.1.3 父子关系 200
- 8.1.4 反规范化 200
- 8.2 将对象作为字段值 202
- 8.2.1 映射和索引对象 203
- 8.2.2 在对象中搜索 204
- 8.3 嵌套类型:联结嵌套的文档 206
- 8.3.1 映射并索引嵌套文档 207
- 8.3.2 搜索和聚集嵌套文档 210
- 8.4 父子关系:关联分隔的文档 216
- 8.4.1 子文档的索引、更新和删除 218
- 8.4.2 在父文档和子文档中搜索 220
- 8.5 反规范化:使用冗余的数据管理 227
- 8.5.1 反规范化的使用案例 228
- 8.5.2 索引、更新和删除反规范化的数据 230
- 8.5.3 查询反规范化的数据 233
- 8.6 应用端的连接 234
- 8.7 小结 235
- *二部分
- 第9章 向外扩展 238
- 9.1 向Elasticsearch集群加入节点 238
- 9.2 发现其他Elasticsearch节点 241
- 9.2.1 通过广播来发现 241
- 9.2.2 通过单播来发现 242
- 9.2.3 选举主节点和识别错误 243
- 9.2.4 错误的识别 244
- 9.3 删除集群中的节点 245
- 9.4 升级Elasticsearch的节点 250
- 9.4.1 进行轮流重启 250
- 9.4.2 *小化重启后的恢复时间 251
- 9.5 使用_cat API 252
- 9.6 扩展策略 254
- 9.6.1 过度分片 254
- 9.6.2 将数据切分为索引和分片 255
- 9.6.3 *大化吞吐量 256
- 9.7 别名 257
- 9.7.1 什么是别名 258
- 9.7.2 别名的创建 259
- 9.8 路由 261
- 9.8.1 为什么使用路由 261
- 9.8.2 路由策略 262
- 9.8.3 使用_search_shards API来决定搜索在哪里执行 263
- 9.8.4 配置路由 265
- 9.8.5 结合路由和别名 265
- 9.9 小结 267
- 第 10章 提升性能 268
- 10.1 合并请求 269
- 10.1.1 批量索引、更新和 删除 269
- 10.1.2 多条搜索和多条获取 API接口 273
- 10.2 优化Lucene分段的 处理 276
- 10.2.1 刷新和冲刷的阈值 276
- 10.2.2 合并以及合并策略 279
- 10.2.3 存储和存储限流 282
- 10.3 充分利用缓存 285
- 10.3.1 过滤器和过滤器 缓存 285
- 10.3.2 分片查询缓存 291
- 10.3.3 JVM堆和操作系统 缓存 293
- 10.3.4 使用预热器让缓存 热身 296
- 10.4 其他的性能权衡 297
- 10.4.1 大规模的索引还是 昂贵的搜索 298
- 10.4.2 调优脚本,要么 别用它 301
- 10.4.3 权衡网络开销,更少的 数据和更好的分布式 得分 305
- 10.4.4 权衡内存,进行深度 分页 308
- 10.5 小结 310
- 第 11章 管理集群 311
- 11.1 改善默认的配置 311
- 11.1.1 索引模板 312
- 11.1.2 默认的映射 315
- 11.2 分配的感知 318
- 11.2.1 基于分片的分配 318
- 11.2.2 强制性的分配感知 319
- 11.3 监控瓶颈 320
- 11.3.1 检查集群的健康 状态 320
- 11.3.2 CPU:慢日志、热线程和 线程池 322
- 11.3.3 内存:堆的大小、字段和 过滤器缓存 326
- 11.3.4 操作系统缓存 330
- 11.3.5 存储限流 330
- 11.4 备份你的数据 331
- 11.4.1 快照API 331
- 11.4.2 将数据备份到共享的文件系统 332
- 11.4.3 从备份中恢复 335
- 11.4.4 使用资料库插件 336
- 11.5 小结 337
- 附录A 处理地理空间的数据(网上下载)
- 附录B 插件(网上下载)
- 附录C 高亮(网上下载)
- 附录D Elasticsearch的监控插件(网上下载)
- 附录E 使用渗滤器将搜索颠倒过来(网上下载)
- 附录F 为自动完成和“您是指”功能使用建议器(网上下载)