SOLR分布式搜索技术实现分析
概述
Solr 单机支持的搜索数据量是有一定上限的,这个取决于搜索的复杂程度,服务器的硬件配置与业务的要求等等,所以将搜索功能分布化将是对于大数据搜索的一个必然趋势。
Solr 从 1.3 版本开始,自带了分布式搜索( Distributed Search )。这个功能使得 Solr 能够通过多服务器进行横行扩展,对数据进行水平拆分,从而支持海量数据的搜索功能。
Solr-3.6.1 版本对分布式搜索的支持功能如下:
搜索功能模块
是否支持分布式搜索
Query component
Y
Facet component
Y
Highlighting component
Y
Spell Check Component
Y
Terms Component
Y
Stats component
Y
Term Vector Component
Y
Debug component
Y
Grouping component
Y
QueryElevationComponent
N
MoreLikeThis
N
Join
N
由于业务功能和时间的缘故,本文将只讨论 Query component 的技术实现逻辑。
注意事项
在使用 Solr 进行分布式搜索的时候,需要注意以下细节:
schema.xml 中定义的 unique key 必须保存在索引中。因为 Solr 在进行 2nd phrase 搜索时需要使用这个 unique key 进行数据一致性的二次确认与获取搜索要求查询的字段数据。 分布在不同服务器中的索引文件中包含的 unique key 不要有重复。因为 Solr 在进行 1st phrase 搜索时需要根据这些 unique key 进行排序与去重,如果 unique key 有重复,包含相同 unique key 的 doc 结果将随机返回。 搜索结果不要有过多的翻页。因为 Solr 的分布式搜索中,会将需要翻页排序后的总结果全部返回给 proxy solr server 进行汇总排序,如果翻页过多,那么对网络带宽将会照成一定的压力。 注意 HTTP 连接数。因为 Solr 的分布式搜索中,服务器可能既是 search server 又是 proxy server ,一遍等待 http 请求应答有一遍处理 http 请求,多台服务器之间就可能会出现死锁。分布式搜索逻辑实现
Query component 的实现原则为: Multi-phased approach, allowing for inconsistency ,具体的实现细节如下:
客户端发送搜索请求给 Solr 集群中的任意一台服务器 SP 。 SP 服务器处理分布式查询请求 Phase One 构建查询请求,只获取查询 Doc 的 unique key 与 sort field 字段。 将构建好的请求通过 HTTP 发送给每一个 Solr Shard 节点。 等待 Solr Shard 节点返回查询结果。 根据排序规则,逐个合并 Solr Shard 节点返回的查询结果。 Phase Two 构建查询请求,根据 unique key 查询客户端查询的相关字段数据。 将构建好的请求通过 HTTP 发送给每一个需要请求的 Solr Shard 节点。 等待 Solr Shard 节点返回查询结果。 逐个合并 Solr Shard 节点返回的查询结果,构建本次查询的最终结果。 SP 服务器将分布式查询结果返回给客户端注意:当前的版本中,分布式查询中如果有某一个 Shard 异常,整体的查询将失败。
参考文档 http://wiki.apache.org/solr/DistributedSearch http://wiki.apache.org/solr/WritingDistributedSearchComponents http://wiki.apache.org/solr/DistributedSearchDesign Solr-3.6.1 源码
标签: solr
作者: Leo_wl
出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息