设为首页 收藏本站
查看: 1010|回复: 0

[经验分享] solr集成zoie

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-11-11 15:31:11 | 显示全部楼层 |阅读模式
  

  
Zoie Solr Plugin

  
  http://linkedin.jira.com/wiki/display/ZOIE/Zoie+Solr+Plugin?focusedCommentId=8454154#comment-8454154
  

  
Zoie中文文档及简单解析

  
  

  http://linkedin.jira.com/wiki/pages/viewpage.action?pageId=4456480

  

  

  

  用了差不多两天的时间来整合他们,文档太少。。后面下了zoie3.0与solr1.4.0才可以完整整合。
  

  前面由于用lucene3.3.0与solr.3.3.0与zoie版本不对,导致一些错误很特别,运行可以,编译也成功,就是奇怪在提交数据后就会抛出异常。
  

  

  之后转为官方指定的版本,采用solr1.4.0.才算是完成。不过在提交数据的时候又出了另一个问题,我使用的是solrj3.3.0版本,提交老不成功 ,换为solrj1.4后,执行ZoieUpdateHandler这个类,在方法addDoc(AddUpdateCommand cmd) 调用的时候,总抛出异常。。。
  

  try {
//            zoieUid = Long.parseLong(id);
            zoieUid = Long.parseLong(uid2);
        } catch (Exception e) {
            throw new IOException("index uid must exist and of type long: "
                    + id);
        }
  

  

  后面发现id的值很怪异,是一些乱码。。。可能转换有问题,后面直接修改代码 ,   

  String idName = this.idField.getName();
     
        String uid = cmd.doc.get(idName);

        String uid2=(String) cmd.solrDoc.getFieldValue(idName);
  

  

  才去掉了那个乱码情况,刚接触zoie框架,所以也不太熟。才解决问题再说,有时间研究 zoie的实现原理也是很好的,对准实时搜索很感兴趣,还不知道具体的性能如何。
  

  虽然整合了,很多奇怪现象也出现,提交索引好,发送优化索引命令无效果 。。有待研究。。
  

  

  --------------------------------------------------------------------------------------------------------------------------
  今天发现的新问题。。
  

  之前在提交数据的时候,都是发送了commit命令,才看到数据。。。但zoie的设计应该不是这样的,因为每一次commit  ,solr都需要重新打开reader,但zoie设计,本来就不想这样,因 为这样的消耗也太大了吧。。尝试不发送commit,看是否要可以看到zoie定时刷新数据到索引 ,发现真的可以,总算是成功引用了zoie的索引机制,它会在%SOLR_HOME%/index/目录下,新建一个目录,并将新刷新的数据索引到这个目录下。。但问题又来了,看到有新索引文件在建立,但是在solr层上搜索不到数据出现,也就是新的数据还是不可见,还是要发送commit才可以看到。。
  

  怎么解决这个问题呢。。。
  照道理应该是不用触发solr重新打开reader就可以读到数据的呀,这才是为什么要整合zoie的,那是否是自己没整合好的问题呢,还是zoie对于solr的插件还没做好支持呢???希望有能之士能给于解决方案!!!!
  

  最后发现zoie的测试代码也是每次新建一个indexSearcher来搜索数据,如果这样的话,solr的solrIndexSearcher就要经常性重新打开,跟commit一样,因为那个就是触发solr重新打开一个SolrIndexSearcher。但SolrIndexSearcher,每次重新打开就会调用很多操作,比如拷贝缓存,结果缓存,filterCache。这样的影响还是挺大的。。有没有更好的解决方案呢??

  

  

  --------------------------------------------------------------------------------------------------------------------------
  有个新想法,不知道可否实现 :
  

  zoie有两个索引reader管理,如果将SolrIndexSearcher包装起来,变成两个SolrIndexSearcher,一个对应硬盘的reader,当内存索引刷到硬盘后,重新打开硬盘reader后,再重新打开对应的SolrIndexSearcher,而另一个SolrIndexSearcher对应内存索引的reader,如果要做到经常性打开也成,也可以是定时打开。
  

  --------------------------------------------------------------------------------------------------------------------------
  

  另外一种方式是,定时打开一个新的SolrIndexSearcher,但由于新的SolrIndexSearcher如果将旧的缓存拷贝的话,如果缓存的拷贝是硬拷贝,则每一个新的SolrIndexSearcher占用的内存一定不小,而且还要频率的打开,这样JVM应该承受不起,如果是软拷贝,不过我觉得软拷贝的可能性应该比较低,这个看代码再说。
  
或者直接不要SolrIndexSearcher的缓存,包括

  private final SolrCache filterCache;
  private final SolrCache queryResultCache;
  private final SolrCache documentCache;
  private final SolrCache fieldValueCache;
  

  这样的话,每次重新打开一个新的SolrIndexSearcher的消耗就不会很大,可以考虑将缓存那一级放在更高一层,不知道这样好不好。。
  -------------------------------------------------------------------------------------------------------------------------
  

  

  

  使用了solr的facet功能后,抛出异常
  

  
HTTP Status 500 - org/apache/lucene/index/MultiZoieTermDocsjava.lang.IllegalAccessError: org/apache/lucene/index/MultiZoieTermDocsat proj.zoie.api.ZoieMultiReader.termDocs(ZoieMultiReader.java:234)at org.apache.lucene.index.DirectoryReader$MultiTermDocs.termDocs(DirectoryReader.java:1177)atorg.apache.lucene.index.DirectoryReader$MultiTermDocs.termDocs(DirectoryReader.java:1164)at org.apache.lucene.index.DirectoryReader$MultiTermDocs.next(DirectoryReader.java:1102)at org.apache.lucene.search.FieldCacheImpl$StringIndexCache.createValue(FieldCacheImpl.java:712)atorg.apache.lucene.search.FieldCacheImpl$Cache.get(FieldCacheImpl.java:208)at org.apache.lucene.search.FieldCacheImpl.getStringIndex(FieldCacheImpl.java:676)at org.apache.solr.request.SimpleFacets.getFieldCacheCounts(SimpleFacets.java:350)at org.apache.solr.request.SimpleFacets.getTermCounts(SimpleFacets.java:255)atorg.apache.solr.request.SimpleFacets.getFacetFieldCounts(SimpleFacets.java:283)at org.apache.solr.request.SimpleFacets.getFacetCounts(SimpleFacets.java:166)at org.apache.solr.handler.component.FacetComponent.process(FacetComponent.java:72)at org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:195)atorg.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:131)at org.apache.solr.core.SolrCore.execute(SolrCore.java:1316)at org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:338)at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:241)atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)atorg.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)atorg.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269)atorg.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)at java.lang.Thread.run(Thread.java:662)
  
  

  等待解决。。

  

  

  ------------------------------------------------------
  

  由于整合到solr3.3的时候,合并索引段老有问题,没有见到段合并到一起,看到索引的目录文件越来越多,真纠心,先暂时不理这个,想搞定solr1.4与zoie3.0的整合吧,解决上面那个facet异常问题,将zoie所有源代码的依赖全改为与solr1.4对应的版本下的lucene包。(lucene2.9.1,solr-core.1.4.0)
  编译后打包,将包放在solr/home目录 下的lib目录 。运行。使用facet也正常。
  

  

  当提交索引时,这个时候使用facet还是会抛出上面那个异常。。很纳闷。。
  后面在tomcat看到的异常,感觉有点思路,说是加载不到对应的class.有可能是类加载器不同导致的,我猜想.
  

  很杯具的解决办法:将zoie相关的包放在Solr1_4\webapp\WEB-INF\lib这个目录 下,然后一切都好了。奇怪。。
  

  再使用facet的时候没有抛出异常了。
  提交索引过程中,使用facet也不抛异常了。

  
--------------------------------------------------------------------------------------------------------
  删除数据的时候会遇到下面这个异常:



  

  

  问过其另一个使用这个zoie的朋友 ,他也曾遇过,等待解决中。。。先记下

  

         版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-138022-1-1.html 上篇帖子: Lucene/solr的评分公式 下篇帖子: solr 基础知识
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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