from http://ronxin999.blog.163.com/blog/static/4221792020118131129725/?suggestedreading
如果你的请求URL中有shards参数,例如q=aa&shards=http://localhost:8787/solr,http://localhost:8783/solr,
则说明当前是分布式请求。Solr会对每个shard片(对应一个Solr应用)发起两次请求,这个过程在QueryComponent组件里实现。
QueryComponent 把请求分为几步,其中有两步分别是makequery和getfield,
makequery
SearchHander会先通过QueryComponent的一个方法创建一个发给shard的请求,其中比较关键的是会给url带上查询参数fl=id,score根据情况是否会带,我们知道fl是代表只返回那些field,Solr会取schema配置文件的uniquerField,所以这次请求就只返回id的值。得到id值后,QueryComponent会合并id,如果不同的shard有相同的id,则会只取一个。到这里只是完成了makequery这一。
getfield
然后SearchHander会做getField这一步,getField是通过QueryComponent来封装请求参数,其中最关键的是封装ids参数,即根据上面请求得到的ids参数把他作为值放到url里,再一次发请求根据id来取对应的field,我们知道solr有个filterCache过滤器。就是这个时候派上用场的。
本文写的比较简单,只是对研读的代码做了下总结,下面会继续完善。