solr集成zoie


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)at org.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)at org.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)at org.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)at org.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)at org.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)at org.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)at org.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)at org.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)at java.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的朋友 ,他也曾遇过,等待解决中。。。先记下


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值