前言
译者序
搜索无处不在,搜索已经融入我们工作、生活的方方面面。除每天使用的通用搜索引擎以外,几乎我们使用的所有互联网应用、ERP、企业内联网等都提供(或应该具备)了搜索功能。我们向搜索引擎发出查询请求后,很快就能得到一大堆相关的搜索结果,它是怎么做到的呢?这是搜索引擎的黑箱秘密。开源搜索技术Solr&Lucene是一套很好的技术工具,能够帮助我们打开这一黑箱,洞悉搜索引擎背后的技术原理与运行机制,并能够借此“真枪实干”地做搜索。
一种观点认为,搜索引擎是信息检索系统的一种类型,即面向网络环境中的海量异构数据的采集、组织与检索。在学科专业领域中,信息检索的研究一直以来都是象牙塔里的一门高深学问。Solr&Lucene的出现拉近了信息检索学术界与搜索引擎业界之间的距离,加速了搜索应用的设计与开发,新的模型算法与搜索功能在Solr的开发技术架构中得以快速转化与实现。
信息检索是“用户需求(行为)—搜索技术(引擎)—信息资源(集合)”三位一体的复合研究主题。搜索研究的原始起点是用户需求与搜索行为,搜索引擎技术是将用户需求与信息资源进行相关度匹配的重要中介手段。没有搜索技术就无从着手开发,不关注用户需求与搜索行为的话,搜索就无从谈起。那么,如何全面理解搜索并开发搜索应用?为了回答这个问题,《Solr实战》的内容安排试图在技术、资源与用户三者之间找到一种平衡。本书以用户搜索问题解决为导向,通过各种操作实例,全面系统化地介绍了Solr的主要功能与使用方法。由于搜索引擎技术体系庞大,涉及数据采集(网络爬虫)、文本处理、自然语言处理、索引、搜索及其他许多方面,要把这么多理论内容和实践操作放进一本书里,着实不是一件容易的事情,然而本书作者做到了!本书虽然也算得上是一本大部头,但相较于很多大部头技术书,作者对技术细节与技术复杂度的收放考虑还是比较得当的,同时也兼顾涵盖了分布式SolrCloud、多语种搜索、个性化推荐等热门主题,具有较好的搜索基础普适性与进阶助推性作用。
如果把搜索引擎比作一台汽车,Lucene与Solr的关系就好比是“发动机”与“造车平台”。Lucene提供了核心的索引与搜索功能,Solr向下对Lucene进行了底层技术封装,隐藏了大量技术细节,降低了进入搜索应用开发的技术门槛。与此同时,Solr向上扩展了开放集成的大量高级搜索功能,用来满足各种搜索业务需求。因此,Solr为我们提供了一个更易于学习、操作与应用的全功能开源搜索平台。面对现实的搜索业务需求,从Solr入手可以让你进入搜索技术应用层的快车道,通过对Solr的深入了解与搜索业务结合,在解决实际搜索问题的大前提下,继而回归到Lucene内核的学习。当遇到诸如索引效率问题、相关度模型与算法问题时,自然而言地就深入到Lucene内部了。所以,从搜索应用设计与开发的角度来看,从Solr入门是一条更有实践效率和学习成就感的途径。
当前开源搜索技术研究与实践非常活跃,这直接反映在了Solr的版本变化上。2010年3月Solr开源项目与Lucene开源项目合并之后,Solr成为Lucene的一个子项目。从3.1版本起,Lucene与Solr的版本保持了一致。版本更新在索引与搜索性能优化、多元化搜索功能引入、交互体验设计、bug修复等方面不懈地努力着,但Solr搜索技术的核心模块并没有发生实质性改变。所以,从搜索技术的学习角度来说,书中使用的Solr版本是够用的。Solr5.0之后涉及少量基础操作命令的变化,但这不影响书中内容的讲解,我们在书中必要的地方做了注释,方便读者对比。当然,寄希望于读完一本书就能胜任搜索开发恐怕是不现实的。面对网上各种碎片化、不同版本的Solr技术资料,对于初涉搜索技术的入门者而言,以这本大部头作为搜索技术学习的小目标,会是一个不错的选择。
本书的初译按章节分工如下:范炜负责第1、5、6、7、8、16章,侯任夷负责第2、3章,金国栋负责第4、12章,邹婧琳负责第9、10章,陈皇丹负责第11、13章,吴亚平负责第14、15章,张功卫、伍志鹏负责附录与其他翻译资料的整理。最终由范炜进行全书的统稿与校对,胡康林参与了校样的审读。
本书的翻译工作历时较长,在此期间王中英与符隆美两位编辑给予了充分信任与理解,并付出了大量辛苦工作,对此表示衷心感谢。鉴于译者专业水平有限,以及专业术语的不一致等问题,译文中难免存在不当之处,恳请读者批评指正。
范炜
2017年3月4日于川大江安河畔
原书推荐序
Solr拥有悠久而成功的历史,Solr4和SolrCloud开启了全新的篇章。《Solr实战》的出版非常应景。书中包含清晰的案例、启发性的图表,涵盖了从核心概念到最新功能的方方面面,有助于你快速掌握Solr。
2004年,CNET科技资讯网(现在的CBS互动媒体公司)的搜索引擎服务提供商不再提供服务,CNET需要一套搜索替代方案,于是有了Solr。我开始编写Solr的时候,虽然不具备专业搜索背景,但做起来很上手。这可能与我的软件设计理念“要快”有关。这一观点有助于Solr在传统企业搜索市场以外得以拓展。
截至2005年年底,Solr为CNET旗下的许多网站提供了搜索与分面导航功能,而且很快成为了开源软件。2006年1月,Solr被捐赠给了Apache软件基金会,成为LucenePMC的子项目,与LuceneJava(现在的LuceneCore)是兄弟项目关系。由于Solr使用Lucene作为全文搜索核心库,两者的技术开发人员有较大的重合度,2010年两个项目就合并在一起了。现在Lucene和Solr仍然可以分别下载,但它们的开发由一个团队统一进行管理。Solr版本号跳跃式地匹配了Lucene版本号,因而两者新版本的发布得以同步。
Solr4版本是Solr的一个重要里程碑,增加了SolrCloud。SolrCloud拥有一组高度可扩展的功能,包括无单点故障的分布式索引构建。NoSQL方面的功能扩展包括事务日志、更新持久性、乐观并发与原子更新。Trey和Timothy作为Solr的资深专家和社区成员,他们撰写的《Solr实战》一书涉及了Solr重要的新功能,并为Solr新手提供了很好的起步指引。
原书推荐序
现在Solr的应用比我预想的要多得多,涉及图书馆集成系统、电子商务平台、数据分析与商务智能产品、内容管理系统及互联网搜索,等等。Solr从早期只有少数采用者逐渐成长为大规模的全球社区,在用户的帮助和志愿者的积极推动下,不断向前发展。
《Solr实战》介绍了Solr使用的必备知识和技术,这些都是自2004年以来的开发积累。本书在手,可以助你掌握Solr的开发。你也可以加入到Solr的全球社区,推动Solr更好地发展。
YonikSeeley
Solr的创造者
前言
2008年,我受命接管凯业必达(CareerBuilder)招聘网的搜索技术团队。最初使用微软的FAST搜索平台,但随后我们意识到,搜索对凯业必达招聘网而言非常重要,与其继续依赖搜索服务提供商,不如在团队内培养搜索专家。我随即开始调研同类型的开源搜索软件,发现Solr似乎满足我们搜索开发所需的大部分核心功能。2009年夏,经过充分的搜索技术准备之后,我们决定将已有的搜索系统转换到Solr。
Solr的发展很顺利。Solr构建在开源搜索库Lucene之上。2005年2月,Lucene正式成为Apache顶级项目。2006年Solr被捐赠给Apache软件基金会,并于2007年1月成为Apache顶级项目。这两项技术的发展都达到了一定规模之后,在2010年3月合并为一个项目。
2010年夏,我们的搜索平台完全转换到了Solr。在转换过程中,我们提升了搜索速度,大幅度减少了搜索架构所需的服务器数量,避免了昂贵的软件许可费用,增强了平台的稳定性,从先前依赖搜索服务提供商的外部主导转向内部的搜索自主创新。
当时我们并没有意识到搜索自主创新所带来的附加价值。我们已经能够开发出一整套全新的搜索应用产品,包含关键词搜索、语义搜索、大数据分析及实时推荐引擎。我们将Solr作为可扩展的搜索架构,一小时内通过数百台服务器处理数十亿级的文档与数百万级的查询请求。我们进入了灵活扩展的云服务时代,在数据爆炸中寻求数据的社会意义与价值。Solr让我们有能力解决迎头而来的挑战。
当Manning出版社找到我谈《Solr实战》一书的写作事宜时,我犹豫了,因为我清楚这是一项艰巨的任务。我提出一个要求:需要一位得力的合作者,而TimothyPotter正是合适的人选。Tim拥有多年Lucene和Solr搜索方案的开发经验。他利用Solr和其他大数据前沿技术,在社交数据的文本分析系统构建与实时分析解决方案方面有着丰富经验。多年来,我俩都得到过Solr社区的诸多帮助。当得知开源社区确实需要一本案例驱动的Solr指南时,Tim和我很高兴能撰写《Solr实战》这本书,为下一代搜索工程师提供帮助。这本书是五年前我们开始接触Solr时希望看到的,不论你是刚开始学习Solr,还是需要补充搜索知识,希望这本书能够对你有帮助。
致谢
与Solr一样,这本书的问世离不开广大开源社区成员的支持,在此对他们表示感谢。
?Lucene/Solr提交者不但能编写令人惊叹的代码,还能提供宝贵的专业知识和建议,同时又能对社区新成员保持足够的耐心。
?感谢Lucene/Solr社区的活跃成员积极贡献代码、更新Wiki
商品简介
本书介绍了当下*流行的开源搜索技术解决方案Solr。在搜索引擎视域下,循序渐进地介绍了Solr是什么、Solr 能做什么,以及如何更好地使用Solr 进行开发。在搜索基础层,本书从Solr 的快速搭建入手,介绍了Solr 背后的信息检索基本概念,之后重点讲解了构建一个搜索引擎所需的核心模块:索引构建、文本分析、执行搜索及处理搜索结果。在搜索功能层,详细介绍了Solr 的四大增强型搜索功能:分面搜索、搜索结果高亮、查询建议、搜索结果分组等。在搜索研究的进阶层,介绍了SolrCloud、多语种搜索及复杂查询操作等。*后,围绕搜索引擎的本质核心问题“相关度”展开了讨论与展望。本书适合搜索技术工程师、搜索应用设计者以及对搜索引擎技术感兴趣的读者阅读,也可作为高校计算机专业信息技术方向、信息管理与信息系统专业等的课程参考资料。
作者简介
Trey Grainger是CareerBuilder公司的工程总监。Timothy Potter是LucidWorks公司工程组的资深成员。两位作者都在从事Solr的可扩展性和可靠性、推荐引擎及大数据分析技术等方面的工作。
范炜,四川大学信息管理技术系副教授,情报学硕士生导师。主要从事信息组织与检索方面的教学科研工作。参编《信息管理导论(第3版)》和《信息组织(第3版)》,技术审校《Web信息架构(第2版)》和《搜索模式》。中国图书馆学会信息组织专业委员会委员、国际十进制分类法UDC咨询委员会委员,国际信息科学与技术协会ASIS&T、国际知识组织学会ISKO会员。
目录
第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 Solr 4 的新功能 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
以下为对购买帮助不大的评价