`
shuany
  • 浏览: 250468 次
  • 性别: Icon_minigender_1
  • 来自: 中国
社区版块
存档分类
最新评论

转: Solr Multicore 结合 Solr Distributed Searching 切分大索引来搜索

    博客分类:
  • solr
阅读更多

原文出处:http://blog.chenlb.com/2009/01/solr-multicore-work-with-solr-distributed-searching-to-search-big-index.html

Solr Distributed Searching (分布式搜索) 是 solr 1.3 的特性。大索引,可能有多种原因要把它分成N个小的索引,可以把小索引放到其它的机器上,但是我没这么多机器怎么办呢?solr 1.3 有 multicore,恩,multicore 简单使用  可以看我那一篇文章。各个 core 各不干扰,可以独立做索引(做索引时,可以分散到各个core上)。

现来看下 Distributed Searching 的效果,打开:http://localhost:8080/solr-cores/core0/select/?q=*%3A*&version=2.2&start=0&rows=10&indent=on&shards=localhost:8080/solr-cores/core0,localhost:8080/solr-cores/core1  可以看到三条记录,core0 一条,core1 二条。

接着会有一个问题:原来很多程序调用 solr,用如 localhost:8080/solr-cores/select/?q=*%3A* 。又不想改原来的调用的代码,能不能做到透明呢,探索...

记得以前看 solr 文档时可以定义一些默认的查询参数,那 shards 参数也应该可以写在配置里。然后再 core0 的 solrconfig.xml 文件里的 standard request handler 里加入这参数,如:

 
  1.    < requestHandler   name = "standard"   class = "solr.SearchHandler"   default = "true" >   
  2.    <!-- default values for query parameters -->   
  3.     < lst   name = "defaults" >   
  4.       < str   name = "echoParams" > explicit </ str >   
  5.       < str   name = "shards" > localhost:8080/solr-cores/core0,localhost:8080/solr-cores/core1 </ str >   
  6.     </ lst >   
  7. </ requestHandler >    
  <requestHandler name="standard" class="solr.SearchHandler" default="true">
  <!-- default values for query parameters -->
   <lst name="defaults">
     <str name="echoParams">explicit</str>
     <str name="shards">localhost:8080/solr-cores/core0,localhost:8080/solr-cores/core1</str>
   </lst>
</requestHandler> 

马上运行下,但好长时间没有结果,CPU使用率很高,深思了下,.... 估计是死循环,因为solr解析shards后,调用shard时,是用默认的request handler。而其中一个shard又是core0(自身),那就等于不会结果的递归。所以这种方法不行。要避免死循环,就不要core0来做合并,可 以找其它。于是我就加了一个tomcat实例如localhost:8080/solr来做代理(合并结果),结果成功运行。

想来想去,能不能不要另一个tomcat实例呢,直接就用一个 core,继续再探索... 。

我再开一个 core 就命名为 core,复制core0为core。把原来core0/solrconfig.xml的配置的shards去掉,然后在 solr1.3/example/multicore/solr.xml里加,如:

 
  1. <? xml   version = "1.0"   encoding = "UTF-8"   ?>   
  2. < solr   persistent = "false" >      
  3.   
  4.    < cores   adminPath = "/admin/cores" >   
  5.      < core   name = "core"   instanceDir = "core"   />   
  6.      < core   name = "core0"   instanceDir = "core0"   />   
  7.      < core   name = "core1"   instanceDir = "core1"   />   
  8.    </ cores >   
  9. </ solr >    
<?xml version="1.0" encoding="UTF-8" ?>
<solr persistent="false">  

  <cores adminPath="/admin/cores">
    <core name="core" instanceDir="core" />
    <core name="core0" instanceDir="core0" />
    <core name="core1" instanceDir="core1" />
  </cores>
</solr> 

结果成功运行。其中,core0、core1是有数据的,而core是没数据的,core只是运行合并。问题虽然可以差强人意地解决。但是还有一个 问题:原来的程序要调用solr,所有url不能改变,加了core是要改url 的,看源码时发现它可以为core名定义别名,就是用“,”号隔开。改为如下:

 
  1. <? xml   version = "1.0"   encoding = "UTF-8"   ?>   
  2. < solr   persistent = "false" >      
  3.   
  4.    < cores   adminPath = "/admin/cores" >   
  5.      < core   name = "core,,"   instanceDir = "core"   />   
  6.      < core   name = "core0"   instanceDir = "core0"   />   
  7.      < core   name = "core1"   instanceDir = "core1"   />   
  8.    </ cores >   
  9. </ solr >    
<?xml version="1.0" encoding="UTF-8" ?>
<solr persistent="false">  

  <cores adminPath="/admin/cores">
    <core name="core,," instanceDir="core" />
    <core name="core0" instanceDir="core0" />
    <core name="core1" instanceDir="core1" />
  </cores>
</solr> 

"core,,"为什么是两个","号呢?。"core,"解析不出两个名,所有就无别名了。"core,,",解析出两个名,一是:"core,一是:"" 空串。有了空串就可以原来的url可以到达core(合并的core)。

至于死循环问题,同事在看源码,看是否不用多加一个额外的core来合并。结果他发现一个shard.qt的参数可以解决此问题,本质就是让所有的 shard调用不用默认request handler,shard.qt可以做到这一点,使所有的shard调用都加qt参数。

现来改为最后的方案,在core0与core1的solrconfig.xml里加一个request handler如:

 
  1. < requestHandler   name = "shard"   class = "solr.SearchHandler"   />   
<requestHandler name="shard" class="solr.SearchHandler" />

然后再core0的solrconfig.xml的默认request handler加shards参数,与shards.qt为shard(shard request handler),如:

 
  1. < requestHandler   name = "standard"   class = "solr.SearchHandler"   default = "true" >   
  2. <!-- default values for query parameters -->   
  3.   < lst   name = "defaults" >   
  4.     < str   name = "echoParams" > explicit </ str >   
  5.     < str   name = "shards.qt" > shard </ str >   
  6.     < str   name = "shards" > localhost:8080/solr-cores/core0,localhost:8080/solr-cores/core1 </ str >   
  7.   </ lst >   
  8. </ requestHandler >    
<requestHandler name="standard" class="solr.SearchHandler" default="true">
<!-- default values for query parameters -->
 <lst name="defaults">
   <str name="echoParams">explicit</str>
   <str name="shards.qt">shard</str>
   <str name="shards">localhost:8080/solr-cores/core0,localhost:8080/solr-cores/core1</str>
 </lst>
</requestHandler> 

然后在,solr.xml里的core(没数据的去掉),把core0加上空的别名,如:

 
  1. < core   name = "core0,,"   instanceDir = "core0"   />   
<core name="core0,," instanceDir="core0" />

当然也可以在core1里加相同的参数,这样core0与core1的功能是一样的,就是两个搜索的url都可以找到所有的数据,我认为:每个配置 一样,在索引分到其它机器的时候比较有作用(如果这样,可以不用multicore的形式,即原始形式),在外面看不出是几个索引的,同时合并的任务也均 匀一些。

Solr Distributed Searching 当然也会消耗,合并的core会向每个shard的core发送两次请求:第一次是找id;第二次是根据id再找文档。如果有N个shard,可以认为有 2N+1次请求,1是作合并的请求,其中2N的请求(发每个shard发送的)是用二进制协议通信,性能比xml协议好。

分享到:
评论

相关推荐

    java进阶Solr从基础到实战

    Solr它是一种开放源码的、基于 Lucene 的搜索服务器,可以高效的完成全文检索的功能。在本套课程中,我们将全面的讲解Solr,从Solr基础到Solr高级,再到项目实战,基本上涵盖了Solr中所有的知识点。 主讲内容 章节一...

    相关性搜索利用Solr与Elasticsearch创建智能应用

    资源名称:相关性搜索 利用Solr与Elasticsearch创建智能应用内容简介:《相关性搜索:利用Solr与Elasticsearch创建智能应用》揭开了相关性搜索的神秘面纱,告诉大家如何将 Elasticsearch与 Solr这样的搜索引擎作为可...

    Solr的Multicore(分片)配置

    Solr的Multicore(分片)配置,内容很好!

    solr5.4.0完整包

    Solr 依存于Lucene,因为Solr底层的核心技术是使用Lucene 来实现的,Solr和Lucene的本质区别有以下三点:搜索服务器,企业级和管理。Lucene本质上是搜索库,不是独立的应用程序,而Solr是。Lucene专注于搜索底层的...

    太阳黑子:Solr支持的Ruby对象搜索

    Sunspot是一个Ruby库,用于与Solr搜索引擎进行富有表现力的强大交互。 Sunspot构建在RSolr库的顶部,该库为Solr交互提供了一个低级接口。 Sunspot提供了简单,直观,富有表现力的DSL,并以强大的功能为后盾,可为...

    相关性搜索 利用Solr与Elasticsearch创建智能应用

    本书揭开了相关性搜索的神秘面纱,告诉大家如何将Elasticsearch 或Solr 这样的搜索引擎作为可编程的相关性框架,从而表达业务排名规则。从这本书中你可学会如何结合各种外部数据源、分类方法以及文本分析手段对...

    nodebb-plugin-solr:使用Apache Solr全文搜索NodeBB

    Solr搜索NodeBB : Solr(发音为“ solar”)是来自Apache Lucene项目的开源企业搜索平台。 它的主要功能包括全文搜索,命中突出显示,多面搜索,动态聚类,数据库集成以及丰富的文档(例如Word,PDF)处理。 此...

    ES和solr搜索方案对比

    ES和solr都是基于Lucence的搜索框架,文档比较2中方案适合的不同场景和优劣

    gmap-solr:Solr 多边形搜索

    #Learning Solr 多边形搜索 1.安装python要求 pip install -r requrements.txt 2.更改server.py中的基本ul 3.运行服务器 python server.py ##截屏

    Solr实现电扇站内搜索

    Solr实现电扇站内搜索Solr实现电扇站内搜索Solr实现电扇站内搜索Solr实现电扇站内搜索

    基于SSM框架+solr搜索框架实现的校园二手交易平台源码+数据库

    基于SSM框架+solr搜索框架实现的校园二手交易平台源码+数据库 平台开发使用的技术有: 后台:spirng,springmvc,mybaits, 前台:angularjs+bootstrap。 权限控制:shiro 搜索引擎:solr 分布式搜索引擎。 数据库:...

    毕业设计-旅游系统源码-trip-search:solr构建景点搜索引擎

    以开源搜索框架Solr和Lucene为基础,以另外一些开源项目例如Heritrix、webmagic、Zookeeper、Ionic、gradle、jetty等为工具,并在相关文档和技术博客的帮助下,完成了整个垂直搜索引擎系统的开发。用到的技术主要有...

    solrb:Solr +Ruby+ OOP +:red_heart:= Solrb

    Ruby中面向对象的Solr方法。 目录 安装 将solrb添加到您的Gemfile中: gem 'solrb' 如果要将solrb与solr cloud一起使用: gem 'zk' # required for solrb solr-cloud integration gem 'solrb' 配置 通过环境变量...

    solr-8.1.1.zip

    solr搜索框架:solr-8.0.0.zip for Microsoft Windows systems

    solr-8.1.1-src.tgz

    solr搜索框架:solr-8.0.0.tgz for Linux/Unix/OSX systems

    Solr结合Java所需Jar

    Solr结合Java所需Jar,Solr结合Java所需Jar,Solr结合Java所需Jar

    Solr高级搜索+tomcat整合服务器

    Solr如何进行索引和搜索 索引:客户端(可以是浏览器可以是java程序)发送post请求到solr服务器,发给solr服务器一个文档(xml、json),就可以进行一个添加索引删除索引、修改索引的操作。 搜索:客户端(可以是...

    solr 搜索短语搜索不出来的解决方案

    NULL 博文链接:https://ldcsunnyboy.iteye.com/blog/1113251

    solr/ext/ 里面的jar包

    org.apache.solr.common.SolrException: Could not find necessary SLF4j logging jars. If using Jetty, the SLF4j logging jars need to go in the jetty lib/ext directory. For other containers, the ...

Global site tag (gtag.js) - Google Analytics