第1部分 初识Solr 1
1 Solr入门 2
1.1 为什么需要搜索引擎 3
1.1.1 管理以文本为中心的数据 3
1.1.2 常见的搜索引擎用例 6
1.2 Solr是什么 8
1.2.1 信息检索引擎 9
1.2.2 灵活的模式管理 11
1.2.3 Java Web应用 12
1.2.4 一台服务器上的多个索引 13
1.2.5 可扩展性(插件) 13
1.2.6 可伸缩性 14
1.2.7 容错性 15
1.3 选择Solr的理由 15
1.3.1 面向软件架构师的Solr 15
1.3.2 面向系统管理员的Solr 16
1.3.3 面向CEO的Solr 17
1.4 功能概述 17
1.4.1 用户体验功能 17
1.4.2 数据建模功能 19
1.4.3 Solr4的新功能 20
1.5 本章小结 22
2 Solr上手 23
2.1 开始上手 24
2.1.1 Solr的安装 24
2.1.2 启动Solr的示例服务器 25
2.1.3 了解Solr主目录 29
2.1.4 对示例文档进行索引 30
2.2 一切都关乎搜索 31
2.2.1 Solr查询表单详解 31
2.2.2 Solr的搜索返回机制 34
2.2.3 排名检索 36
2.2.4 分页和排序 36
2.2.5 扩展的搜索功能 38
2.3 Solr管理控制台一览 40
2.4 根据需求改造搜索示例服务器 42
2.5 本章小结 43
3 Solr基础理论 45
3.1 搜索、匹配与找寻内容 46
3.1.1 何为文档 46
3.1.2 基本搜索问题 47
3.1.3 倒排索引 50
3.1.4 词项、短语与布尔逻辑 51
3.1.5 找到文档集 53
3.1.6 短语查询与术语位置 55
3.1.7 模糊匹配 57
3.1.8 快速小结 61
3.2 相关度 61
3.2.1 默认相似度 62
3.2.2 词项频次 63
3.2.3 反向文档频次 64
3.2.4 词项权重 65
3.2.5 规范化因子 66
3.3 查准率与查全率 67
3.3.1 查准率 67
3.3.2 查全率 68
3.3.3 达到平衡 69
3.4 搜索的规模化 70
3.4.1 非规范化文档 70
3.4.2 分布式搜索 72
3.4.3 集群vs.服务器 73
3.4.4 Solr的局限 74
3.5 本章小结 75
4 配置Solr 77
4.1 solrconfig.xml文件概览 80
4.1.1 常见的XML数据结构和数据类型元素 82
4.1.2 配置文件更新的应用 82
4.1.3 Solr的其他配置 83
4.2 查询请求处理 85
4.2.1 请求处理简介 86
4.2.2 搜索处理器 88
4.2.3 Solritas的browse请求处理器示例 90
4.2.4 利用搜索组件扩展查询处理 94
4.3 管理搜索器 98
4.3.1 新建搜索器 99
4.3.2 新搜索器预热 100
4.4 缓存管理 103
4.4.1 缓存原理 103
4.4.2 过滤器缓存 105
4.4.3 查询结果缓存 108
4.4.4 文档缓存 110
4.4.5 字段值缓存 110
4.5 其他配置选项 110
4.6 本章小结 111
5 创建索引 112
5.1 微博搜索应用示例 113
5.1.1 面向搜索的内容表示 113
5.1.2 Solr索引构建概览 115
5.2 设计自己的schema 117
5.2.1 文档粒度 117
5.2.3 索引字段 119
5.2.4 存储字段 119
5.2.5 schema.xml概览 120
5.3 在schema.xml中定义字段 121
5.3.1 必备字段属性 122
5.3.2 多值字段 123
5.3.3 动态字段 124
5.3.4 复制字段 127
5.3.5 唯一键字段 129
5.4 结构化非文本字段类型 129
5.4.1 字符串字段 130
5.4.2 日期字段 131
5.4.3 数值字段 133
5.4.4 高级字段类型属性 134
5.5 发送文档到Solr进行索引 137
5.5.1 使用XML或JSON进行文档索引 137
5.5.2 使用SolrJ客户端库添加文档索引 140
5.5.3 向Solr导入文档的其他工具 142
5.6 更新处理器 143
5.6.1 将文档提交到索引 145
5.6.2 事务日志 146
5.6.3 原子更新 148
5.7 索引管理 151
5.7.1 索引存储 151
5.7.2 索引片段合并 154
5.8 本章小结 156
6 文本分析 157
6.1 微博文本分析 158
6.2 基础文本分析 161
6.2.1 分析器 163
6.2.2 分词器 163
6.2.3 分词过滤器 164
6.2.4 StandardTokenizer 164
6.2.5 使用StopFilterFactory移除停用词 165
6.2.6 使用LowerCaseFilterFactory对词项进行小写转换 166
6.2.7 通过Solr分析表单进行文本分析测试 167
6.3 为微博文本自定义一个字段类型 169
6.3.1 使用PatternReplaceCharFilterFactory折叠重复的字母 172
6.3.2 保留主题标签、提及符号和连字符词项 173
6.3.3 使用ASCIIFoldingFilterFactory移除变音符号 177
6.3.4 使用KStemFilterFactory提取词干 177
6.3.5 在查询阶段使用SynonymFilterFactory加入同义词 178
6.3.6 把过滤器组合在一起 179
6.4 高级文本分析 182
6.4.1 高级字段属性 182
6.4.2 各语种文本分析 183
6.4.3 使用Solr插件扩展文本分析 185
6.5 本章小结 188
第2部分 Solr的核心功能 191
7 执行查询和处理搜索结果 192
7.1 Solr请求详解 193
7.1.1 请求处理器 193
7.1.2 搜索组件 197
7.1.3 查询解析器 200
7.2 查询解析器的使用 201
7.2.1 指定查询解析器 201
7.2.2 局部参数 201
7.3 查询和过滤器 204
7.3.1 fq和q参数 204
7.3.2 处理代价过高的过滤器 207
7.4 默认查询分析器(Lucene查询解析器) 209
7.4.1 Lucene查询解析器语法 209
7.5 处理用户查询(eDisMax查询解析器) 215
7.5.1 eDisMax查询解析器概述 216
7.5.2 eDisMax查询参数 216
7.5.3 搜索多个字段 216
7.5.4 查询与短语的权重调整 217
7.5.5 字段别名 219
7.5.6 可访问字段 221
7.5.7 最小匹配 221
7.5.8 eDisMax的优缺点 223
7.6 其他有用的查询解析器 225
7.6.1 字段查询解析器 225
7.6.2 词项查询解析器和原始查询解析器 225
7.6.3 函数查询解析器和函数区间查询解析器 226
7.6.4 嵌套查询和嵌套查询解析器 226
7.6.5 调整权重查询解析器 227
7.6.6 前缀查询解析器 228
7.6.7 空间查询解析器 228
7.6.8 连接查询解析器 228
7.6.9 分支查询解析器 229
7.6.10 外围查询解析器 229
7.6.11 最大得分查询解析器 230
7.6.12 折叠查询解析器 230
7.7 返回搜索结果 231
7.7.1 选择响应格式 231
7.7.2 选择返回字段 233
7.7.3 搜索结果分页 235
7.8 搜索结果排序 237
7.8.1 按字段排序 238
7.8.2 按函数排序 239
7.8.3 模糊排序 239
7.9 调试查询结果 240
7.9.1 返回调试信息 240
7.10 本章小结 241
8 分面搜索 242
8.1 搜索结果概览 243
8.2 建立测试数据 246
8.3 字段分面 250
8.4 查询分面 255
8.5 区间分面 257
8.6 基于分面值的过滤 260
8.6.1 在分面上使用过滤器 260
8.6.2 基于分面值的安全过滤方法 264
8.7 多选分面、键与标记 266
8.7.1 键 266
8.7.2 标记、排除和多选分面 268
8.8 超越分面基础 271
8.9 本章小结 271
9 搜索结果高亮 272
9.1 高亮简介 273
9.2 高亮工作原理 274
9.2.1 为UFO目击数据创建新的Solr内核 275
9.2.2 索引构建前预处理UFO目击数据集 275
9.2.3 探索UFO目击数据集 278
9.2.4 开箱即用的高亮 278
9.2.5 高亮具体细节 281
9.2.6 改善高亮显示结果 287
9.3 使用FastVectorHighlighter组件提升性能 292
9.4 PostingsHighlighter组件 293
9.5 本章小结 296
10 查询建议 297
10.1 拼写检查 298
10.1.1 索引维基百科的文章 298
10.1.2 拼写检查举例 300
10.1.3 拼写检查搜索组件 303
10.2 自动建议查询词 309
10.2.1 自动建议请求处理器 309
10.2.2 自动建议搜索组件 311
10.3 文档字段值建议 312
10.3.1 使用n-grams生成建议 312
10.3.2 n-gram-driven请求处理器 314
10.4 基于用户活动提供查询建议 315
10.5 本章小结 320
11 结果分组/字段折叠 321
11.1 结果分组vs.字段折叠 322
11.2 忽略重复文档 322
11.3 搜索结果中每组返回多个文档 330
11.4 按照函数和查询对结果分组 334
11.4.1 按照函数进行分组 334
11.4.2 按照查询进行分组 336
11.5 对分组结果进行分页和排序 337
11.6 分组陷阱 340
11.6.1 根据结果分组进行分面操作 340
11.6.2 分布式结果分组 342
11.6.3 返回扁平化列表 343
11.6.4 按多值和分词字段进行分组 343
11.6.5 分组性能 344
11.7 使用折叠查询解析器进行高效的字段折叠 344
11.8 本章小结 346
12 搭建Solr生产环境 347
12.1 编写一份Solr的分发版 347
12.2 部署Solr 348
12.2.1 编译自定义的Solr分发版 348
12.2.2 在应用程序中内嵌Solr 349
12.3 硬件和服务器配置 350
12.3.1 内存和固态硬盘 350
12.3.2 JVM设置 351
12.3.3 索引切换 352
12.3.4 实用Solr系统配置技巧 355
12.4 数据获取策略 357
12.5 分片和复制 361
12.5.1 分片策略 361
12.5.2 复制策略 364
12.6 Solr内核管理 368
12.7 管理服务器集群 374
12.7.1 负载均衡器和Solr健康检查 374
12.7.2 通用配置vs.自定义配置 375
12.8 Solr的查询与交互 378
12.8.1 REST API 378
12.8.2 可用的Solr客户端库 378
12.8.3 使用SolrJ 379
12.9 监控Solr的性能 383
12.9.1 Solr的插件/统计页 383
12.9.2 Solr缓存性能 387
12.9.3 从请求处理器和MBeans获取统计信息 388
12.9.4 外部监控选项 389
12.9.5 Solr日志 390
12.9.6 加载测试 390
12.10 不同Solr版本之间的升级 391
12.11 本章小结 392
第3部分 Solr进阶 393
13 SolrCloud 394
13.1 SolrCloud上手 395
13.1.1 在云模式下启动Solr 395
13.1.2 SolrCloud架构的驱动因素 400
13.2 核心概念 405
13.2.1 集合vs.内核 405
13.2.2 ZooKeeper 406
13.2.3 确定分片和副本的数量 410
13.2.4 集群状态管理 411
13.2.5 确定分片代表 412
13.2.6 SolrCloud的重要配置 413
13.3 分布式索引 416
13.3.1 将文档分配给分片 417
13.3.2 添加文档 418
13.3.3 近实时搜索 421
13.3.4 节点恢复过程 422
13.4 分布式搜索 423
13.4.1 多阶段查询流程 423
13.4.2 分布式搜索的局限性 425
13.5 集合API 425
13.5.1 创建集合 426
13.5.2 集合别名 429
13.6 基本系统管理任务 431
13.6.1 配置更新 432
13.6.2 滚动重启 432
13.6.3 重启故障节点 433
13.6.4 节点X处于活跃状态吗 433
13.6.5 新增副本 434
13.6.6 异地备份 434
13.7 高级主题 435
13.7.1 自定义散列 435
13.7.2 分片分割 436
13.8 本章小结 438
14 多语种搜索 439
14.1 为什么语种分析很重要 440
14.2 词干提取vs.词形还原 441
14.3 词干提取实战 442
14.4 处理边界情况 447
14.4.1 KeywordMarkerFilterFactory 448
14.4.2 StemmerOverrideFilterFactory 448
14.5 Solr支持的语种库 449
14.5.1 特定语种的分析器 449
14.5.2 基于词典的词干提取(Hunspell) 452
14.6 在多语种中搜索内容 453
14.6.1 每种语言一个独立字段 453
14.6.2 每个语种构建单独的索引 459
14.6.3 支持多语种的单个字段 462
14.6.4 创建一个字段类型来处理支持多语种的单个字段 463
14.7 语种识别 475
14.7.1 语种识别更新处理器 475
14.7.2 在一个字段中动态分配语种检测分析器 482
14.8 本章小结 488
15 复杂查询操作 489
15.1 函数查询 490
15.1.1 函数语法 490
15.1.2 函数的搜索 492
15.1.3 以字段形式返回函数 494
15.1.4 函数排序 495
15.1.5 Solr的可用函数集 496
15.1.6 自定义函数 502
15.2 地理空间搜索 507
15.2.1 搜索附近的一个点 507
15.2.2 高级地理空间搜索 513
15.3 分面透视 523
15.4 引用外部数据 526
15.5 跨文档和跨索引的连接 528
15.6 使用Solr做大数据分析 531
15.7 本章小结 532
16 精通相关度 533
16.1 相关度调整的影响 534
16.2 相关度计算的调试 535
16.3 提升相关度 541
16.3.1 字段提升 541
16.3.2 词项提升 543
16.3.3 负载提升 544
16.3.4 函数提升 545
16.3.5 词项邻近度提升 547
16.3.6 提升重要文档的相关度 549
16.4 可插拔的相似度的类实现 552
16.5 个性化搜索与推荐 553
16.5.1 搜索vs.推荐 554
16.5.2 基于属性的匹配 554
16.5.3 分层匹配 556
16.5.4 更多类似结果 558
16.5.5 基于概念的匹配 563
16.5.6 地理位置的匹配 568
16.5.7 协同过滤 569
16.5.8 混合方式 573
16.6 塑造个性化搜索体验 574
16.7 开展相关度实验 574
16.8 本章小结 577
附录A 与Solr代码库打交道 578
附录B 语种字段类型配置 587
附录C 有用的数据导入配置 593