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