最近的一个项目里要用wiki作为底层模型的知识源,这半个月里先后尝试了JSPWiki,xwiki,mediawiki,对这三个开源wiki都做了很多了解,在这里记录一下。
JSPWiki
开始时候找到JSPWiki,JSPWiki的基本功能都是有的,但问题是它采用了文件的方式,而不是数据来存储数据,这在我们后期分析数据、为项目提供知识源时候会有很大的困难,因此没有过多的研究
XWiki
xwiki是一个JAVA编写的比较流行的开源wiki软件了,它支持各种数据库,功能也很完善。
在了解xwiki的过程中,感觉它的功能比JSPWiki强大,除wiki基本功能,还提供博客功能,因此结构上有些复杂。有两点是它的优点,一是他的页面组织方式符合人们的一般思维,即先建分类、再建条目;二是他默认采用所见即所得的编辑器,不需要用户了解特殊的语法规则就能正常使用。但是我在使用中发现,xwiki不支持多级分类,它的一层空间下面,不能包含子空间、而只能包含页面,这样的结构肯定不能满足大型的应用,所以也没有选择它。
另外在了解xwiki数据库结构时,找到了页面内容存储的地方。xwiki页面内容存在xwikircs表中,内容以xml格式存在XWR_PATCH字段中,用
select XWR_PATCH from xwikircs where XWR_DOCID = ......;
可以讲内容读出,可以发现,页面评论在<comment></comment>标签中,页面内容在<content></content>标签中。
mediawiki
mediawiki是用php编写的wiki系统,应该是目前应用最广的了。它的结构比较清晰,但是我在实际体验中,也发现了几点问题:
- mediawiki的页面组织结构不符合一般思维方式,它默认采用的方式是让人先建条目,再建分类,这种方式使得新用户很迷惑
- mediawiki没有提供创建页面和分类的快捷入口。不像xwiki,用户一目了然知道怎么创建分类,然后往分类添加条目,mediawiki需要你阅读它的使用手册后才能明白该怎么创建页面并把它指向某一分类,这就提高了用户的使用门槛,我认为不够易用
- mediawiki没有默认使用所见即所得编辑器,用户需要了解基本的编辑语法才能正常使用编辑功能
发现这些问题后,我的工作就是寻找各种插件试图提高易用性和分析它的数据库了。
mediawiki数据库结构图见附件1
经过逐表观察,发现页面内容存在text表中old_text字段,内容以BLOB格式存储,所以读出来还得写代码将二进制流转换为String,以下是代码:
String sql ="select * from mw_text";
ResultSet rs=stmt.executeQuery(sql);
int i =1;
while(rs.next()){
Blob blob=rs.getBlob("old_text");
BufferedInputStream bi=new BufferedInputStream(blob.getBinaryStream());
byte[] data=new byte[(int)blob.length()];
String output="";
bi.read(data);
output=new String(data);
bi.close();
System.out.println("第"+i+"条记录");
System.out.println(output);
System.out.println();
i++;
}
同时,为了让mediawiki符合一般的使用习惯,我在官网上看了很多的插件,地址
http://www.mediawiki.org/wiki/Category:Extensions
尝试了很多插件,发现下面几个比较好
- NiceCategoryList,效果如图
- CategoryTree,效果如图
- ArticleToCategory2,效果如图
- ManageCategories,效果如图
- fckeditor
- inputbox,效果如图