查看文章 |
Roller 4源码分析笔记(5)- 搜索
2007-10-02 10:51
实现Roller的搜索功能的包是org.apache.roller.weblogger.business.search及其子包org.apache.roller.weblogger.business.search.operations。依然是经典的Facade模式,由Interface IndexManager提供总的访问接口,IndexMangerImpl提够实现,如下图所示。 观看IndexManger接口,可知它主要提够了6个操作: 1)public void removeWebsiteIndex(Weblog website) throws WebloggerException 删除整个Website的index,由RemoveWebsiteIndexOperation提够实现,由一个线程在后台执行的。 2)public void removeEntryIndexOperation(WeblogEntry entry) throws WebloggerException 删除Entry的Index,由RemoveEntryOperation提够实现,由一个线程在前台立即执行,以便及时反应结果 3)public void addEntryIndexOperation(WeblogEntry entry) throws WebloggerException 添加Entry的Index,由AddEntryOperation提够实现,由一个线程在后台执行 4)public void addEntryReIndexOperation(WeblogEntry entry) throws WebloggerException 重新索引Entry,由AddEntryReIndexOperation提够实现,由一个线程在后台执行 5) public abstract void rebuildWebsiteIndex(Weblog website) throws WebloggerException 6) public abstract void rebuildWebsiteIndex() throws WebloggerException 重新索引website,由RebuildWebsiteIndexOperation提够实现,由一个线程在后台执行,其中6是删除所有website的index,而5仅是删除一个website的index,因为Lucene没有提供delete_all方法,所以实现的时候,每个index的 Document都加上一个额外的Field(FieldConstants.CONSTANT),且有相同的域值(FieldConstants.CONSTANT_V)。 从上图我们可以看到,IndexOperation主要分为读操作(ReadFromIndexOperation)和写操作(WriteToIndexOperation),做这样的区分主要是为了并发,通过一个读写锁,读操作获取读锁,写操作获取写锁,这样就能获得最大的并发效果。 我们可以看到实际上,IndexManager并未提供对Search的支持,这应该算是设计上的一个失败,而且在源代码中,方法的接口直接使用的是IndexManagerImpl,使得IndexManger这个接口更加没有存在的意义,实际上在Roller中这样的设计上的不优美随处可见,老外的东西也不一定就好呀:-)。 |
最近读者:
