一:概念
Solr是可扩展的、开箱即用的企业级搜索引擎,用来搜索大规模文本数据并根据相关度排序返回结果。
1:可扩展——Solr通过集群中多台服务器的分布式运行实现扩展。
2:开箱即用——Solr是开源的,易于安装和配置,并提供预先配置好的示例服务器,方便上手。
3:为搜索优化——Solr速度很快,以亚秒级速度执行复杂查询,往往只需花费几十毫秒。
4:大规模文档——Solr可以用以处理包含百万级文档的索引。
5:以文本为中心
6:根据相关度排序——Solr根据文档与用户查询的相关程度对文档进行排序,并以此排序返回结果。
二:搜索引擎适用场景
1:以文本为中心
2:读主导
3:面向文档
4:灵活的模式(不像关系型数据库那样需要格式化数据,同一份索引可以包含不同的字段)
5:处理大数据量
三:Solr和Lucene的比较
Lucene是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。
Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置(schema.xml文件、复制字段、动态字段)、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Solr Get操作提出查找请求,并得到XML格式的返回结果。
注:Solr基于已有的XML、JSON和HTTP标准,提供简单的类REST风格的服务,由于Solr并没有严格遵守所有的REST原则,因此要避免为Solr基于HTTP的API打上REST的标记,例如:在Solr中,删除文档适用HTTP的POST方法,而不是用HTTP的DELETE方法。
四:Solr的三个主要核心(子系统)
1:文档管理
2:查询处理
3:文本分析
Solr的每个子系统都是由模块化的 “管道” 构成的,通过插件的方式实现新功能。这意味着,没有必要推翻Solr的整个查询处理引擎,只需要在已有管道中介入新的搜索构件即可。这使得Solr的核心功能易于扩展,并能根据特定应用需求实现定制。
五:Solr的可伸缩性
Lucene是一个执行速度相当快的搜索类库,Solr汲取了Lucene速度方面的所有优点。但是无论Lucene有多快,由于CPU的IO限制,单台服务器终会达到来自不同用户的并发请求的处理上限。
实现伸缩性的方法:
1:Solr提供灵活的缓存管理功能,帮助服务器重用运算量大的数据扩容。(关于缓存后续再讲)
2:Solr可以通过增加服务器实现增容(查询吞吐量的扩容、文档索引量的扩容)
如果在三台服务器上复制索引,每秒查询数量会变成查询的三倍,因为每台服务器只用处理三分之一的查询请求。在现实中,完美的线性伸缩性很难实现,因此,增加三台服务器可能会比一台服务器增速2.5倍。
注:关于硬件:Solr的确可以运行在虚拟机硬件上,但是搜索是IO和内存密集型应用。因此,首先应该考虑在高性能磁盘(如固态硬盘SSD非常理想)的高端硬件上部署Solr。
六:Solr的容错性
假设索引有4个分片,托管分片2的服务器断电了。这时,Solr无法继续索引文档和提供查询服务,搜索引擎基本就宕机了。为了避免这种情况,需要为每个分片添加副本。当分片2发生故障时,Solr可以启用副本来索引和处理查询,Solr集群能够保持联机状态。这种情况下故障虽然不会影响索引和查询,但由于少了一个处理请求的服务器,可能会降低速度。
七:Solr功能概述
用户体验功能
1:分页与排序
2:分面
3:自动建议
4:拼写检查
5:搜索结果高亮
6:地理空间搜索
数据建模功能
1:结果分组 / 字段折叠
2:灵活的查询语法
3:JOIN连接
4:文档聚类
5:支持各种文档格式,如PDF和Word
6:从关系型数据库导入数据DIH
Solr4以上新功能
1:近实时搜索
2:原子更新与乐观并发
原子更新:原子更新功能允许客户端应用在已有的文档上进行添加、更新、删除和对字段的增值,而且无需重新发送整个文档。
solr支持三种类型的原子更新:
set - to set a field. 对指定的field,修改其为指定的值(也可以是Null)
add - to add to a multi-valued field. 添加一个多值字段。
inc - to increment a field. 对指定的数值型field,增加(在原有的数值上相加)指定的数值。
乐观并发:solr使用特殊的_version_版本字段来确保文档的安全更新。对于两个用户同事更改同一个文档的情况,后提交更改的用户将会获得一个过时的版本字段,所以会更新失败。例如:A用户和B用户同时修改_version_版本号为1的文档,当A用户修改完毕提交,将版本号修改为2,那么B用户提交更改时候获取的版本号1已经过期,所以更新会失败。
3:实时GET功能
4:使用事务日志实现写持续性
5:支持Solrcloud部署模式