转载请务必注明出处:http://guoyunsky.iteye.com/blog/761308
最近要使用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. **分布式搜索**:SolrCloud是Solr的分布式搜索和索引分片功能,但在1.4.0版本中,Solr尚未集成这一特性。不过,可以通过设置多个独立的Solr实例实现基本的分布式部署。 4. **实时索引**:Solr支持实时索引,即新...
在Solr 6.2.0版本中,这个强大的分布式搜索引擎引入了许多新特性和改进,使其在处理大规模数据搜索时更加高效。 一、Solr的架构与工作原理 Solr的核心架构包括客户端API、Solr服务器和索引库。客户端通过HTTP或...
### Solr集群搭建与SolrCloud分布式搜索方案详解 #### 一、SolrCloud概述 SolrCloud 是 Apache Solr 提供的一种分布式搜索解决方案。它主要用于处理大规模数据集的索引和检索工作,并具备容错性和分布式特性。当...
lucene&solr原理分析,lucene搜索引擎和solr搜索服务器原理分析。
总之,Solr的分布式特性使得它成为大数据时代下企业级搜索应用的理想选择,能够有效应对大规模数据的处理和高并发的挑战。在实际应用中,根据具体业务场景进行适当的配置和优化,可以充分发挥Solr的潜力,构建高效、...
在Solr 6.6.0中,SolrCloud提供了分布式搜索和管理能力。它依赖于ZooKeeper进行集群管理和数据分配。ZooKeeper负责节点的注册、状态监控、分片分配和领导者选举等任务。 五、优化与性能 1. **缓存机制**:Solr包含...
Solr项目源码及solr资源包是一个针对搜索...通过深入研究和实践这个“Solr项目源码及solr资源包”,开发者不仅可以掌握Solr的基本用法,还能了解Spring Data Solr的高级特性,从而提升在实际项目中的搜索引擎开发能力。
源码分析是深入理解一个软件系统工作原理的重要途径,对于Solr这样的复杂系统尤其如此。这里我们将围绕"solr-9.0.0-src.tgz"这个源码包,详细探讨其主要组成部分、核心功能以及开发过程中的关键知识点。 1. **Solr...
这个源码包包含了Solr 4.10.4的所有源代码,对于开发者来说,这是一个深入了解Solr工作原理、定制功能以及进行二次开发的重要资源。 1. **Solr简介** Apache Solr是一个基于Lucene的全文检索服务,提供了一个高效...
Solr的分布式部署是大型搜索应用的关键,它能够提高系统的可扩展性和性能。在本文中,我们将深入探讨如何实现Solr的分布式部署,包括需求、步骤、配置以及执行分发脚本。 首先,理解分布式部署的需求是至关重要的。...
在深入探讨Solr-search过程的源码分析时,我们聚焦于关键步骤与核心组件,以求全面理解Solr搜索机制的内部运作。Solr作为一款高性能、可伸缩的开源搜索平台,其搜索处理流程涉及多个层次的组件交互与数据处理,其中...
apache-solr-core-1.4.0.jar,apache-solr-core-1.4.0.jar
总结来说,`apache-solr-dataimporthandler-extras-1.4.0.jar`是一个增强Solr DataImportHandler功能的库,它可以帮助用户更方便地从各种数据源导入和更新数据,提高了Solr作为企业级搜索和分析平台的灵活性和实用性...
在这个源码包中,我们可以深入理解Solr的工作原理以及其核心组件的实现。 首先,让我们了解Solr的基本架构。Solr基于Lucene库构建,Lucene是一个高性能、全文本检索库。Solr在其之上添加了分布式处理、集群管理、...
在本篇Solr学习笔记中,我们将探讨Solr的分布式索引功能,这对于处理大量数据和实现高可用性至关重要。Solr的分布式索引能力允许我们跨越多个节点分布和处理索引过程,从而提高索引速度和查询性能。在实际应用中,这...
Solr(Apache Solr)是基于Java开发的一款全文搜索引擎服务器,它提供了强大的索引和搜索功能,同时也支持...通过深入理解这些组件的工作原理和配置方法,开发者可以构建出强大的搜索系统,满足各种复杂的业务需求。
通过介绍Solr的特性和基于Solr的分布式搜索架构,文章为大数据时代下如何提升搜索引擎性能提供了新的思路和方法。文章的研究成果对于搜索引擎设计、大数据处理以及云计算领域具有重要的理论和实践意义。
ES(ElasticSearch)和Solr都是基于Lucene的搜索引擎,它们各自提供了一套搜索框架,用于实现高效的全文搜索功能。由于两者都是在Apache License 2下开源的,因此在选择使用哪种搜索方案时,需要根据不同的使用场景...
Solr4.3是Apache Solr的一个早期版本,它是一个基于Lucene的全文搜索服务器,提供了高可配置、可扩展的搜索和分析功能。Solr4.3源代码的获取通常是为了深入理解其内部工作原理,进行定制开发或优化。在你提供的信息...