本博客属原创文章,欢迎转载!转载请务必注明出处: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.
更多技术文章、感悟、分享、勾搭,请用微信扫描:
相关推荐
Solr集群搭建:Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud。当一个系统的索引数据量少的时候是不需要使用SolrCloud的,当索引量很大,搜索请求并发很高,这时需要使用...
solr-6.2.0 强大的分布式搜索引擎,包含各种详细例子及源码解析
lucene&solr原理分析,lucene搜索引擎和solr搜索服务器原理分析。
solr1.4源码(欢迎喜欢研究solr的人下载)
solr 分布式参考项目 只是其中一部分
apache-solr-core-1.4.0.jar,apache-solr-core-1.4.0.jar
solr6.6.0源码
solr 分布式 部署,介绍了Solr的分布式部署的需求,步骤,配置、执行分发脚本等。
solr使用和原理 简单明了的介绍了solr的使用和原理,及其部署方式,适合初学者第一次部署
详细阐述Solr-search 源码级别过程
大型SpringMVC,Mybatis,Redis,Solr,Nginx,SSM分布式电商项目视频教程由浅到深的详细讲解了电商项目的搭建,有这方面需求的可以下载
基于Solr的分布式实时搜索模型研究与实现
solr4.10官方源码,保存留用以后下载
Solr 依存于Lucene,因为Solr底层的核心技术是使用Lucene 来实现的,Solr和Lucene的本质区别有以下三点:搜索服务器,企业级和管理。Lucene本质上是搜索库,不是独立的应用程序,而Solr是。Lucene专注于搜索底层的...
solr全文检索,里面包含文档,源代码,jar包,使用的是solr4.2,东西比较全,安装文档就能跑起来,,适合参考借鉴
使用springdatasolr编写的操作solr的项目,导入eclipse即可运行,里面包含solr的资源安装包
分布式多店铺电商系统,使用技术:spring 、springmvc、mybatis、maven、html5、jquery、freemarker、Redis(缓存服务器)、Solr(搜索引擎)、Dubbo(调用系统服务)、Nginx(web服务器)、FastDFS(文件服务器)、...
介绍了Solr5.5内部使用的分词原理,有助于开发者自定义自己的分词器时掌握分词的基础知识。
maven 整合solr4.2环境,另外整合了solr-data-import源码环境,资源10分,十分不贵!有需要的朋友请下载吧。花了我3个小时的时间整理的。下载后,使用maven导入即可使用,升级solr版本也比较方便。本环境使用了...
基于 Lucene 的全文搜索的 开源企业级搜索服务器,拥有XML/HTTP,JSON APIs,hit highlighting, faceted search, caching, replication,web管理界面等很多功能,Solr运行在Java servlet容器比如Tomcat中。 新...