Solr - 核心原理、特点、以及架构详解
1,什么是 Solr?
Solr 是一个高性能、采用 Java 开发、基于 Lucene 的全文搜索服务器。它对 Lucene 做了封装,使用起来更加的方便,并且对外提供类似于 WebService 的接口,可以通过 HTTP 请求进行操作。
2,Solr 的特点
(1)利用 Solr 可以更快速地实现站内搜索功能。它解决了 Lucene 的缺点,并且在性能和使用层面做了进一步优化。它主要具备以下特点:
- 通过 HTTP 协议处理搜索和查询请求。
- 增加了缓存功能,让响应速度更快。
- 提供了一个基于 Web 的管理界面。
- 支持主从复制模式。
- Solr 从 4.0 版本开始增加了 Solr Cloud,支持分布式和大规模的集群部署。
(2)Solr 中文档数据的元数据信息(字段名称、字段类型)是通过 schema.xml 文件维护的。可以在 schema.xml 中配置一些默认字段类型,而且它还提供了 Copy Field 和 Dynamic Filed 这两种 Lucene 没有的字段类型。
注意:这种方式相对于 Lucene 而言是比较灵活的,但是和 Elasticsearch 相比,它还是有点麻烦——要修改字段类型信息则必须修改文件。
3,Solar 架构分析
(1)Solr 是在 Lucene 的架构之上做了进一步封装,所以 Solr 的架构会比 Lucene 复杂,如下图所示:
- 最下面的是 Lucene;
- 中间是 Solr Core 模块(这是 Solr 的核心模块);
- 最上面是一些请求接口。用户通过调用上面的请求接口来对底层的 Lucene 索引库进行操作,这些请求接口都是 Solr 封装好的,易用性更高。

4,Solr 的主从复制模式
(1)Solr 支持主从复制模式:一个 Master 节点负责接收用户请求,多个 Slave 节点负责从 Master 节点同步数据,保持索引数据的一致性,如图下所示。

(2)在 Solr 的主从复制模式下,Master 节点感知不到 Slave 节点的存在,Slave 节点会周期性地轮询 Master 节点来查看当前的索引版本。如果 Slave 节点发现有新的版本,则它会启动复制进程,步骤如下:
- Slave 节点发出一个 Filelist 命令来收集文件列表,该命令将返回一系列元数据(包括 size、lastmodified 等)。
- Slave 节点查看它本地是否有这些文件:如果没有,则开始下载缺失的文件;如果连接失败,则下载终止;它将重试 5 次,如果仍然失败则放弃。
- 文件被下载到 Slave 节点的一个临时目录,所以下载中途出错不会影响 Slave 节点。
- 一个 commit 命令被 ReplicationHandler 执行,新的索引被加载进来,这样即可实现索引数据的复制。