设为首页收藏本站
开启辅助访问
切换到宽版

创星网络[分享知识 传递快乐]

 找回密码
 立即注册

QQ登录

只需一步,快速开始

用新浪微博登录

只需一步,快速搞定

搜索
查看: 4648|回复: 0
打印 上一主题 下一主题

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

[复制链接]

我玩的应用:

跳转到指定楼层
楼主
发表于 2012-12-12 12:40:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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>  
复制代码
马上运行下,但好长时间没有结果,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>   
复制代码
结果成功运行。其中,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>  
复制代码
"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" />  
复制代码
然后再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>   
复制代码
然后在,solr.xml里的core(没数据的去掉),把core0加上空的别名,如:
  1.     <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协议好。

from:http://go.cxweb.com.cn/ur3cj
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|创星网络 ( 苏ICP备11027519号|网站地图  

GMT+8, 2024-9-22 07:11 , Processed in 0.090840 second(s), 27 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表