`
guoyunsky
  • 浏览: 839089 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
3d3a22a0-f00f-3227-8d03-d2bbe672af75
Heritrix源码分析
浏览量:203194
Group-logo
SQL的MapReduce...
浏览量:0
社区版块
存档分类
最新评论

Solr1.4.0源码分析二 Solr分布式搜索中URL的正确用法和原理

阅读更多

 

本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.iteye.com/blog/761308

 

      欢迎加入Heritrix群(QQ): 109148319 

 

     最近要使用Solr做分布式搜索,自己一开始也是从网上搜集一些资料照着做.其中发现对Solr分布式搜索有个误区,会导致搜索结果不正确.比如我这里有两个Shand:
  1)http://localhost:8080/solr1.4/core0/
  2)http://localhost:8080/solr1.4/core1/
  
     我要从中找出查询为110排名为前30的数据,于是我用以下URL:
     1.

 

 

 

 

 

 

 

 

 

 

http://localhost:8080/solr1.4/core0/select?q=110&shards=localhost:8080/solr1.4/core0,localhost:8080/solr1.4/core1&shards.rows=30
       但发现界面上返回的结果只有10条.这里我已经设置了shards.row=30,但为什么会只返回10条呢?于是自己再加了个start参数,URL如下:
      2. http://localhost:8080/solr1.4/core0/select?q=110&shards=localhost:8080/solr1.4/core0,localhost:8080/solr1.4/core1&shards.rows=30&shards.start=30
  发现结果变化了,但条数还是10条.后来跟踪了下源码,才找到原因,URL应该设置成: 

     3.http://localhost:8080/solr1.4/core0/select?q=110&shards=localhost:8080/solr1.4/core0,localhost:8080/solr1.4/core1&shards.rows=60&start=30&rows=30
     其中从排名第30名开始,获得30条结果,也就是获得排名30到60的结果,应该将start和rows设置为start=30&rows=30,而不是shards.start=30&shards.row=30,而Shard里应该设置为shards.start=0&shards.rows=60(shards.start=0可以省略,Solr默认会从0开始),其shards.rows=start+rows.
  

     以上是设置方法,用于分布式搜索获得排名30-60的数据.这里大概讲下原理:
  
     Solr会构造ShardFieldSortedHitQueue去收集从各个Shard查询的结果,该类继承Lucene的PriorityQueue(我模拟了这个类的方法,可以参考我这篇博客:
   http://guoyunsky.iteye.com/blog/723963 ),需要指定排序Field(SortField)和大小.而指定SolrField和大小,Solr里面有个自己的类SortSpec去管理,Solr在查询组件QueryComponent初始化的时候会通过start和rows参数来构造SortSpec.而如果URL里没有这两个参数,则Solr会采用默认的,也就是start=0&rows=10,如此导致我一开始查询结果始终只有10条.
     还有个更严重的问题,如果我需要从多个Shard中获得排名30-60的数据,那么我们肯定要获得每个Shard中排名前60的数据,然后合并各个Shard,找到所有Shard排名前60的数据.然后再从结果后面取30条,也就是排名30-60的数据了.所以如果像我一开始那样指定Shards.row=30,那么获得的是每个Shard排名前30的数据而非60.所以在我第二条URL中加上
  Shards.start=30所获取的结果跟第一条不一样,因为它是让每个Shard取的排名前60的数据.
  
     但发现Solr里面还是有些没注意的地方,比如solrconfig.xml中可以设置<queryResultWindowSize>20</queryResultWindowSize>表示显示结果条数.所以Solr应该采用这个默认值
  而不是它自己定义的10,同时也包括Solr Web管理界面,里面的rows都是设置的10.
  

更多技术文章、感悟、分享、勾搭,请用微信扫描:

分享到:
评论
3 楼 guoyunsky 2010-12-19  
guoyunsky 写道
lazzyGaGa 写道
当start参数很大的时候,性能会下降的很厉害,不知道lz有没有什么好的解决办法


可以将上一次访问的评分传入,将这个评分设置为阀值,如此可以过滤很多数据.但如此需要改动Solr的源码,而且需要改动很多,我在整理中,看能否尽可能通用

2 楼 zy19982004 2010-11-03  
有个疑问:
shards.rows的作用

1.shards.rows=60&start=30&rows=30   
是不是从core1,core2里面各取60条,一共120条,再在这120条里面取30-60之间的数据?
2.start=30&rows=30
从所有的里面取30-60之间的数据?


实验结果是1.2查询结果一样,都时间是否一样?
1 楼 lazzyGaGa 2010-09-25  
当start参数很大的时候,性能会下降的很厉害,不知道lz有没有什么好的解决办法

相关推荐

Global site tag (gtag.js) - Google Analytics